diff --git a/.gitignore b/.gitignore index 8b4e9b9e..1fe46ee4 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ docs/build/ results/TUDELFT_V3_LEI_KITE/polars/tutorial_testing_stall_model_n_panels_54_distribution_SPLIT_PROVIDED.pdf !test/data/*.bin CLAUDE.md +ideas.txt # Claude Code sandbox artifacts .bash_profile @@ -33,10 +34,22 @@ hooks .idea results/TUDELFT_V3_KITE/polars/tutorial_testing_stall_model_n_panels_54_distribution_SPLIT_PROVIDED.pdf .gitignore +data/ram_air_kite/ram_air_kite_foil.dat +data/ram_air_kite/ram_air_kite_foil_cl_polar.csv data/ram_air_kite/ram_air_kite_foil_cd_polar.csv data/ram_air_kite/ram_air_kite_foil_cm_polar.csv output/ output_cairo/ -examples_cp/.CondaPkg/ -test/.CondaPkg/ +.CondaPkg/ LocalPreferences.toml + +# Pipeline-generated polars/dat/cp (regenerate via AirfoilAero/ObjAdapter) +data/**/polars_neuralfoil/ + +# Local planning docs (not tracked) +docs/architecture_plan.md +docs/awesio_alignment_plan.md +docs/awesio_cp_issue_proposal.md + +# Sub-package manifests (env-specific) +lib/**/Manifest.toml diff --git a/Project.toml b/Project.toml index 963917f2..47924f6b 100644 --- a/Project.toml +++ b/Project.toml @@ -21,6 +21,7 @@ Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e" NonlinearSolve = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" PreallocationTools = "d236fae5-4411-538c-8e31-a6e3d9e00b46" PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a" RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" @@ -30,7 +31,6 @@ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" StructMapping = "7c3b921d-20d6-4eba-ad57-605525e86ab2" Timers = "21f18d07-b854-4dab-86f0-c15a3821819a" -Xfoil = "19641d66-a62d-11e8-2441-8f57a969a9c4" YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" [weakdeps] @@ -59,6 +59,7 @@ Measures = "0.3" NonlinearSolve = "4.8.0" Parameters = "0.12" Pkg = "1" +Printf = "1" PreallocationTools = "1.1.2" PythonCall = "0.9" PrecompileTools = "1.2.1" @@ -69,6 +70,5 @@ StaticArrays = "1" Statistics = "1" StructMapping = "0.2.3" Timers = "0.1" -Xfoil = "1.1.0" YAML = "0.4.13" julia = "1.10, 1.11" diff --git a/data/TUDELFT_V3_KITE/V3_25.obj b/data/TUDELFT_V3_KITE/V3_25.obj new file mode 100644 index 00000000..339ed563 --- /dev/null +++ b/data/TUDELFT_V3_KITE/V3_25.obj @@ -0,0 +1,15578 @@ +v -0.721201 -3.736767 9.466451 +v -0.634034 -3.894945 9.069088 +v -0.64392 -3.895637 9.069299 +v -0.710632 -3.736094 9.466028 +v -0.731577 -3.738602 9.467604 +v -0.653627 -3.897557 9.069884 +v -0.74158 -3.741568 9.469469 +v -0.662989 -3.900673 9.070834 +v -0.751041 -3.745614 9.472013 +v -0.671846 -3.904931 9.072132 +v -0.759797 -3.750671 9.475192 +v -0.680046 -3.910258 9.073757 +v -0.687449 -3.916564 9.075679 +v -0.767698 -3.756652 9.478952 +v -0.693928 -3.923739 9.077867 +v -0.77461 -3.763455 9.483229 +v -0.780414 -3.770963 9.48795 +v -0.699372 -3.931663 9.080283 +v -0.78501 -3.779049 9.493033 +v -0.703689 -3.940198 9.082885 +v -0.788321 -3.787573 9.498392 +v -0.706804 -3.949199 9.08563 +v -0.790288 -3.79639 9.503936 +v -0.708664 -3.958512 9.08847 +v -0.79088 -3.80535 9.509568 +v -0.709238 -3.967978 9.091356 +v -0.790085 -3.814298 9.515194 +v -0.708515 -3.977435 9.094239 +v -0.787918 -3.823081 9.520716 +v -0.706507 -3.98672 9.09707 +v -0.784414 -3.83155 9.52604 +v -0.70325 -3.995675 9.0998 +v -0.779635 -3.83956 9.531076 +v -0.698798 -4.004147 9.102384 +v -0.773662 -3.846972 9.535736 +v -0.693229 -4.01199 9.104775 +v -0.766597 -3.853662 9.539942 +v -0.686637 -4.019071 9.106934 +v -0.758561 -3.859513 9.543621 +v -0.679135 -4.025269 9.108824 +v -0.749692 -3.864426 9.54671 +v -0.670851 -4.030477 9.110412 +v -0.740141 -3.868318 9.549156 +v -0.661928 -4.034606 9.111671 +v -0.730072 -3.87112 9.550918 +v -0.652518 -4.037585 9.112579 +v -0.719657 -3.872786 9.551965 +v -0.642781 -4.039365 9.113122 +v -0.709074 -3.873287 9.55228 +v -0.632885 -4.039913 9.113289 +v -0.622999 -4.039221 9.113078 +v -0.698505 -3.872614 9.551857 +v -0.68813 -3.870779 9.550703 +v -0.613292 -4.037301 9.112492 +v -0.678126 -3.867813 9.548839 +v -0.60393 -4.034185 9.111542 +v -0.668665 -3.863767 9.546295 +v -0.595073 -4.029927 9.110244 +v -0.659909 -3.85871 9.543116 +v -0.586873 -4.0246 9.10862 +v -0.57947 -4.018295 9.106697 +v -0.652008 -3.852729 9.539356 +v -0.572991 -4.011119 9.104509 +v -0.645096 -3.845926 9.535079 +v -0.639292 -3.838418 9.530358 +v -0.567546 -4.003195 9.102094 +v -0.634696 -3.830332 9.525275 +v -0.56323 -3.99466 9.099491 +v -0.631386 -3.821808 9.519915 +v -0.560115 -3.985659 9.096747 +v -0.629418 -3.812991 9.514372 +v -0.558255 -3.976346 9.093907 +v -0.628826 -3.804031 9.508739 +v -0.557681 -3.96688 9.091021 +v -0.629621 -3.795083 9.503114 +v -0.558404 -3.957424 9.088138 +v -0.631789 -3.7863 9.497592 +v -0.560412 -3.948138 9.085306 +v -0.635292 -3.777831 9.492267 +v -0.563669 -3.939183 9.082576 +v -0.640071 -3.769821 9.487232 +v -0.568121 -3.930712 9.079993 +v -0.646044 -3.762409 9.482571 +v -0.57369 -3.922868 9.077601 +v -0.653109 -3.755719 9.478366 +v -0.580282 -3.915787 9.075442 +v -0.661145 -3.749868 9.474687 +v -0.587784 -3.909589 9.073553 +v -0.670014 -3.744955 9.471598 +v -0.596068 -3.904382 9.071965 +v -0.679565 -3.741063 9.469152 +v -0.604991 -3.900253 9.070706 +v -0.689634 -3.738261 9.46739 +v -0.614401 -3.897273 9.069797 +v -0.700049 -3.736595 9.466342 +v -0.624138 -3.895494 9.069255 +v -0.790915 -3.445166 9.775621 +v -0.779775 -3.444604 9.774974 +v -0.801848 -3.446676 9.77736 +v -0.812386 -3.449108 9.780163 +v -0.82235 -3.452421 9.78398 +v -0.83157 -3.456559 9.788747 +v -0.839886 -3.46145 9.794382 +v -0.847157 -3.46701 9.800788 +v -0.853259 -3.473145 9.807856 +v -0.858087 -3.47975 9.815466 +v -0.861559 -3.486711 9.823486 +v -0.863614 -3.49391 9.83178 +v -0.864219 -3.501223 9.840205 +v -0.863362 -3.508525 9.8486185 +v -0.861059 -3.515692 9.856875 +v -0.857348 -3.5226 9.864833 +v -0.852293 -3.529131 9.872358 +v -0.845981 -3.535174 9.879321 +v -0.83852 -3.540625 9.885601 +v -0.830037 -3.545392 9.891092 +v -0.820677 -3.549391 9.895701 +v -0.810601 -3.552556 9.899347 +v -0.799981 -3.554832 9.901968 +v -0.788999 -3.556179 9.903522 +v -0.777843 -3.556575 9.903977 +v -0.766703 -3.556014 9.90333 +v -0.75577 -3.554504 9.901591 +v -0.745231 -3.552072 9.898788 +v -0.735267 -3.548758 9.894971 +v -0.726048 -3.544621 9.890204 +v -0.717732 -3.53973 9.884569 +v -0.71046 -3.534169 9.878163 +v -0.704358 -3.528034 9.871095 +v -0.69953 -3.52143 9.863485 +v -0.696059 -3.514468 9.855465 +v -0.694003 -3.50727 9.847171 +v -0.693399 -3.499957 9.838746 +v -0.694255 -3.492654 9.830333 +v -0.696559 -3.485488 9.822077 +v -0.70027 -3.47858 9.814118 +v -0.705324 -3.472049 9.806593 +v -0.711636 -3.466006 9.79963 +v -0.719098 -3.460554 9.79335 +v -0.727581 -3.455788 9.787859 +v -0.73694 -3.451788 9.78325 +v -0.747016 -3.448624 9.779604 +v -0.757636 -3.446348 9.776983 +v -0.768618 -3.445 9.77543 +v -0.852937 -3.079329 10.026087 +v -0.841314 -3.078768 10.02537 +v -0.864342 -3.080819 10.027994 +v -0.875333 -3.083213 10.031058 +v -0.885722 -3.086469 10.035226 +v -0.895332 -3.090532 10.040427 +v -0.903999 -3.095333 10.046572 +v -0.911574 -3.10079 10.053556 +v -0.917927 -3.106808 10.061259 +v -0.922949 -3.113285 10.0695505 +v -0.926556 -3.120111 10.078286 +v -0.928684 -3.127168 10.087318 +v -0.929298 -3.134335 10.096493 +v -0.928388 -3.141491 10.105652 +v -0.925968 -3.148512 10.114638 +v -0.92208 -3.155279 10.123299 +v -0.91679 -3.161675 10.131487 +v -0.91019 -3.167592 10.13906 +v -0.902392 -3.172928 10.145889 +v -0.89353 -3.177591 10.151858 +v -0.883754 -3.181502 10.156864 +v -0.873233 -3.184594 10.160822 +v -0.862147 -3.186815 10.163664 +v -0.850684 -3.188125 10.165341 +v -0.839042 -3.188503 10.165825 +v -0.827419 -3.187943 10.165107 +v -0.816015 -3.186453 10.1632 +v -0.805024 -3.184059 10.160137 +v -0.794634 -3.180803 10.155969 +v -0.785024 -3.176739 10.150768 +v -0.776358 -3.171938 10.144623 +v -0.768783 -3.166482 10.137639 +v -0.76243 -3.160464 10.129936 +v -0.757407 -3.153987 10.121645 +v -0.753801 -3.147161 10.112909 +v -0.751673 -3.140104 10.103876 +v -0.751058 -3.132936 10.094702 +v -0.751969 -3.125781 10.085543 +v -0.754389 -3.11876 10.076556 +v -0.758277 -3.111993 10.067895 +v -0.763566 -3.105596 10.059708 +v -0.770166 -3.09968 10.052135 +v -0.777964 -3.094344 10.045306 +v -0.786827 -3.089681 10.039337 +v -0.796602 -3.08577 10.034331 +v -0.807123 -3.082677 10.030373 +v -0.81821 -3.080457 10.027531 +v -0.829672 -3.079147 10.025854 +v -0.907221 -2.747275 10.315742 +v -0.89519 -2.746748 10.314942 +v -0.919024 -2.748664 10.317843 +v -0.930397 -2.75089 10.321213 +v -0.941146 -2.753914 10.325793 +v -0.951086 -2.757686 10.331504 +v -0.960048 -2.762141 10.338249 +v -0.967878 -2.767202 10.345913 +v -0.974442 -2.772784 10.354363 +v -0.979628 -2.778789 10.363457 +v -0.983347 -2.785117 10.373037 +v -0.985536 -2.791657 10.382941 +v -0.986158 -2.7983 10.392998 +v -0.9852 -2.80493 10.403037 +v -0.982681 -2.811434 10.412886 +v -0.978642 -2.817702 10.422376 +v -0.973154 -2.823626 10.431345 +v -0.966309 -2.829104 10.439639 +v -0.958226 -2.834042 10.447118 +v -0.949042 -2.838358 10.453651 +v -0.938914 -2.841975 10.459129 +v -0.928017 -2.844833 10.463456 +v -0.916535 -2.846883 10.46656 +v -0.904667 -2.848089 10.468387 +v -0.892614 -2.848432 10.468905 +v -0.880583 -2.847904 10.468106 +v -0.86878 -2.846515 10.466004 +v -0.857407 -2.84429 10.462634 +v -0.846659 -2.841265 10.458055 +v -0.836719 -2.837493 10.452342 +v -0.827757 -2.833038 10.445597 +v -0.819927 -2.827977 10.437934 +v -0.813362 -2.822396 10.429483 +v -0.808176 -2.81639 10.42039 +v -0.804457 -2.810063 10.4108095 +v -0.802268 -2.803522 10.400906 +v -0.801647 -2.79688 10.390848 +v -0.802604 -2.79025 10.380809 +v -0.805124 -2.783745 10.370961 +v -0.809162 -2.777477 10.36147 +v -0.814651 -2.771554 10.352501 +v -0.821495 -2.766076 10.344207 +v -0.829579 -2.761137 10.336729 +v -0.838763 -2.756822 10.330195 +v -0.84889 -2.753204 10.324718 +v -0.859788 -2.750346 10.32039 +v -0.871269 -2.748296 10.3172865 +v -0.883138 -2.74709 10.31546 +v -0.953748 -2.360817 10.499048 +v -0.941377 -2.360478 10.49811 +v -0.965884 -2.361701 10.501496 +v -0.977576 -2.363117 10.505414 +v -0.988624 -2.365038 10.510733 +v -0.99884 -2.367434 10.517364 +v -1.008048 -2.370261 10.52519 +v -1.016091 -2.373474 10.534081 +v -1.022831 -2.377015 10.543883 +v -1.028153 -2.380825 10.554428 +v -1.031966 -2.384838 10.565537 +v -1.034205 -2.388986 10.577019 +v -1.034831 -2.393198 10.588677 +v -1.033834 -2.397402 10.600313 +v -1.03123 -2.401526 10.611726 +v -1.027065 -2.405499 10.622722 +v -1.02141 -2.409253 10.633113 +v -1.01436 -2.412724 10.642721 +v -1.006038 -2.415853 10.6513815 +v -0.996585 -2.418585 10.658946 +v -0.986163 -2.420876 10.665285 +v -0.97495 -2.422684 10.67029 +v -0.963138 -2.42398 10.673877 +v -0.95093 -2.424741 10.675982 +v -0.938534 -2.424953 10.676571 +v -0.926163 -2.424614 10.675633 +v -0.914027 -2.42373 10.673185 +v -0.902335 -2.422315 10.669267 +v -0.891287 -2.420393 10.663948 +v -0.881072 -2.417998 10.657318 +v -0.871864 -2.41517 10.649491 +v -0.863821 -2.411958 10.6406 +v -0.85708 -2.408416 10.630798 +v -0.851758 -2.404606 10.620253 +v -0.847945 -2.400593 10.609144 +v -0.845706 -2.396445 10.597662 +v -0.84508 -2.392233 10.586004 +v -0.846077 -2.388029 10.5743685 +v -0.848681 -2.383905 10.562955 +v -0.852846 -2.379933 10.551959 +v -0.858502 -2.376178 10.541568 +v -0.865551 -2.372707 10.5319605 +v -0.873874 -2.369579 10.5233 +v -0.883327 -2.366846 10.515736 +v -0.893749 -2.364555 10.509396 +v -0.904961 -2.362747 10.504391 +v -0.916773 -2.361451 10.500805 +v -0.928981 -2.360691 10.498699 +v -0.992515 -1.927225 10.606703 +v -0.979864 -1.926882 10.605732 +v -1.004922 -1.928116 10.609223 +v -1.016875 -1.929539 10.613248 +v -1.028168 -1.93147 10.618709 +v -1.038608 -1.933875 10.625514 +v -1.048017 -1.936714 10.633545 +v -1.056233 -1.939939 10.642666 +v -1.063117 -1.943493 10.6527195 +v -1.06855 -1.947316 10.663534 +v -1.072439 -1.951343 10.674924 +v -1.074718 -1.955504 10.686696 +v -1.075348 -1.959729 10.698648 +v -1.074318 -1.963946 10.710575 +v -1.071645 -1.968081 10.722273 +v -1.067376 -1.972065 10.733542 +v -1.061583 -1.975829 10.744189 +v -1.054366 -1.979309 10.754033 +v -1.045848 -1.982445 10.762904 +v -1.036174 -1.985184 10.77065 +v -1.025511 -1.987478 10.77714 +v -1.01404 -1.989289 10.782263 +v -1.001959 -1.990585 10.785929 +v -0.989473 -1.991345 10.788078 +v -0.976796 -1.991555 10.788672 +v -0.964146 -1.991211 10.787701 +v -0.951739 -1.99032 10.785181 +v -0.939786 -1.988898 10.781157 +v -0.928493 -1.986967 10.775694 +v -0.918053 -1.984561 10.768889 +v -0.908644 -1.981722 10.760859 +v -0.900427 -1.978498 10.751739 +v -0.893544 -1.974944 10.741684 +v -0.888111 -1.97112 10.73087 +v -0.884221 -1.967094 10.719479 +v -0.881942 -1.962932 10.707707 +v -0.881313 -1.958707 10.695756 +v -0.882343 -1.954491 10.683829 +v -0.885016 -1.950355 10.672132 +v -0.889285 -1.946371 10.660862 +v -0.895078 -1.942607 10.650214 +v -0.902295 -1.939127 10.640371 +v -0.910813 -1.935991 10.6315 +v -0.920487 -1.933253 10.623754 +v -0.93115 -1.930958 10.617263 +v -0.94262 -1.929148 10.612141 +v -0.954702 -1.927851 10.608474 +v -0.967188 -1.927092 10.606325 +v -1.023521 -1.523465 10.792858 +v -1.010651 -1.523143 10.791852 +v -1.036143 -1.524298 10.795456 +v -1.048301 -1.525626 10.7996 +v -1.059787 -1.527427 10.805219 +v -1.070404 -1.52967 10.812219 +v -1.079971 -1.532317 10.820478 +v -1.088325 -1.535322 10.829856 +v -1.095321 -1.538634 10.840192 +v -1.100841 -1.542197 10.851309 +v -1.10479 -1.545949 10.863017 +v -1.1071 -1.549826 10.875116 +v -1.107733 -1.553762 10.887398 +v -1.106676 -1.55769 10.899655 +v -1.103949 -1.561542 10.9116745 +v -1.099597 -1.565252 10.923252 +v -1.093696 -1.568758 10.93419 +v -1.086346 -1.571998 10.944301 +v -1.077673 -1.574918 10.953412 +v -1.067825 -1.577467 10.961367 +v -1.056971 -1.579602 10.96803 +v -1.045297 -1.581287 10.973286 +v -1.033003 -1.582492 10.977047 +v -1.020298 -1.583197 10.979247 +v -1.0074 -1.58339 10.979849 +v -0.99453 -1.583067 10.978843 +v -0.981908 -1.582235 10.976246 +v -0.96975 -1.580907 10.972102 +v -0.958264 -1.579106 10.966482 +v -0.947647 -1.576863 10.959483 +v -0.938079 -1.574216 10.951223 +v -0.929726 -1.571211 10.941845 +v -0.92273 -1.567898 10.93151 +v -0.91721 -1.564336 10.920392 +v -0.913261 -1.560584 10.908684 +v -0.91095 -1.556706 10.896585 +v -0.910318 -1.55277 10.884303 +v -0.911374 -1.548843 10.872047 +v -0.914102 -1.544991 10.860027 +v -0.918454 -1.54128 10.848449 +v -0.924355 -1.537775 10.837511 +v -0.931705 -1.534535 10.8274 +v -0.940378 -1.531615 10.818289 +v -0.950225 -1.529066 10.810334 +v -0.961079 -1.526931 10.803672 +v -0.972753 -1.525246 10.798415 +v -0.985048 -1.524041 10.794654 +v -0.997753 -1.523336 10.792454 +v -1.04677 -1.103348 10.871432 +v -1.033737 -1.103264 10.870359 +v -1.059551 -1.103565 10.874192 +v -1.071862 -1.103912 10.8785925 +v -1.083491 -1.104381 10.884555 +v -1.09424 -1.104965 10.891981 +v -1.103924 -1.105655 10.900743 +v -1.112379 -1.106438 10.910688 +v -1.119459 -1.1073 10.921649 +v -1.125044 -1.108228 10.933438 +v -1.129037 -1.109205 10.945853 +v -1.13137 -1.110214 10.958681 +v -1.132004 -1.111239 10.971702 +v -1.130928 -1.112262 10.984695 +v -1.12816 -1.113264 10.9974375 +v -1.123747 -1.11423 11.00971 +v -1.117765 -1.115142 11.021303 +v -1.110316 -1.115986 11.032019 +v -1.101528 -1.116745 11.041673 +v -1.091551 -1.117409 11.050102 +v -1.080556 -1.117964 11.05716 +v -1.068731 -1.118402 11.062728 +v -1.056278 -1.118716 11.066708 +v -1.04341 -1.118899 11.069036 +v -1.030348 -1.118948 11.069667 +v -1.017315 -1.118864 11.068594 +v -1.004534 -1.118647 11.065834 +v -0.992223 -1.118301 11.061435 +v -0.980594 -1.117831 11.055471 +v -0.969845 -1.117247 11.048045 +v -0.960161 -1.116557 11.039284 +v -0.951706 -1.115775 11.029338 +v -0.944626 -1.114912 11.018377 +v -0.939041 -1.113984 11.006588 +v -0.935048 -1.113007 10.994174 +v -0.932715 -1.111998 10.981346 +v -0.932081 -1.110973 10.968324 +v -0.933157 -1.109951 10.955331 +v -0.935925 -1.108948 10.942589 +v -0.940338 -1.107982 10.930316 +v -0.94632 -1.10707 10.918723 +v -0.953769 -1.106227 10.908007 +v -0.962557 -1.105467 10.898353 +v -0.972534 -1.104803 10.889924 +v -0.983529 -1.104248 10.882866 +v -0.995354 -1.10381 10.877299 +v -1.007807 -1.103497 10.873318 +v -1.020675 -1.103314 10.870991 +v -1.062267 -0.656322 10.857701 +v -1.049126 -0.656237 10.856615 +v -1.075154 -0.656541 10.860488 +v -1.087565 -0.656889 10.864928 +v -1.099289 -0.657361 10.870945 +v -1.110125 -0.657948 10.878436 +v -1.119887 -0.658641 10.887273 +v -1.128409 -0.659428 10.8973055 +v -1.135544 -0.660295 10.9083605 +v -1.141171 -0.661227 10.920249 +v -1.145194 -0.662208 10.932768 +v -1.147542 -0.663223 10.945704 +v -1.148177 -0.664252 10.958834 +v -1.147088 -0.66528 10.971935 +v -1.144292 -0.666287 10.984782 +v -1.139839 -0.667257 10.997156 +v -1.133803 -0.668174 11.008844 +v -1.126289 -0.669021 11.019646 +v -1.117425 -0.669784 11.029379 +v -1.107362 -0.67045 11.037875 +v -1.096273 -0.671008 11.044988 +v -1.084348 -0.671448 11.050598 +v -1.07179 -0.671762 11.054608 +v -1.058815 -0.671946 11.056949 +v -1.045644 -0.671996 11.057582 +v -1.032503 -0.67191 11.056496 +v -1.019616 -0.671692 11.053709 +v -1.007205 -0.671344 11.049269 +v -0.995481 -0.670872 11.043252 +v -0.984645 -0.670285 11.035761 +v -0.974883 -0.669592 11.026924 +v -0.966361 -0.668805 11.016892 +v -0.959226 -0.667938 11.005837 +v -0.953599 -0.667006 10.993948 +v -0.949577 -0.666024 10.981429 +v -0.947228 -0.66501 10.968493 +v -0.946593 -0.66398 10.955363 +v -0.947682 -0.662953 10.942262 +v -0.950478 -0.661946 10.929415 +v -0.954932 -0.660975 10.917041 +v -0.960967 -0.660059 10.9053545 +v -0.968481 -0.659212 10.894551 +v -0.977345 -0.658449 10.884818 +v -0.987408 -0.657782 10.876323 +v -0.998497 -0.657225 10.869209 +v -1.010422 -0.656785 10.863599 +v -1.02298 -0.65647 10.859591 +v -1.035955 -0.656287 10.857248 +v -1.070026 -0.215541 10.940417 +v -1.056832 -0.215439 10.939325 +v -1.082963 -0.215803 10.943213 +v -1.095423 -0.216219 10.947667 +v -1.107193 -0.216782 10.953702 +v -1.11807 -0.217484 10.961215 +v -1.12787 -0.218311 10.970078 +v -1.136424 -0.219251 10.980138 +v -1.143586 -0.220286 10.991224 +v -1.149234 -0.2214 11.003146 +v -1.15327 -0.222572 11.0157 +v -1.155626 -0.223783 11.028671 +v -1.156262 -0.225013 11.041837 +v -1.155166 -0.22624 11.054973 +v -1.152357 -0.227443 11.067855 +v -1.147883 -0.228601 11.080261 +v -1.141822 -0.229696 11.091979 +v -1.134276 -0.230707 11.10281 +v -1.125375 -0.231618 11.112567 +v -1.115271 -0.232414 11.121084 +v -1.104137 -0.23308 11.128215 +v -1.092163 -0.233605 11.133838 +v -1.079555 -0.23398 11.137857 +v -1.066527 -0.234199 11.140203 +v -1.053304 -0.234258 11.140836 +v -1.04011 -0.234156 11.139744 +v -1.027173 -0.233895 11.136948 +v -1.014713 -0.233479 11.132494 +v -1.002943 -0.232916 11.126459 +v -0.992065 -0.232214 11.118946 +v -0.982266 -0.231386 11.110083 +v -0.973712 -0.230447 11.100023 +v -0.96655 -0.229412 11.088937 +v -0.960902 -0.228298 11.077015 +v -0.956866 -0.227126 11.064461 +v -0.95451 -0.225914 11.05149 +v -0.953874 -0.224685 11.038324 +v -0.95497 -0.223458 11.025188 +v -0.957779 -0.222255 11.012306 +v -0.962252 -0.221097 10.9999 +v -0.968314 -0.220002 10.988182 +v -0.97586 -0.218991 10.977351 +v -0.984761 -0.218079 10.967594 +v -0.994865 -0.217284 10.959077 +v -1.005999 -0.216618 10.951946 +v -1.017973 -0.216093 10.946323 +v -1.030581 -0.215718 10.942304 +v -1.043609 -0.215499 10.939958 +v -1.070026 0.215541 10.940417 +v -1.056832 0.215439 10.939325 +v -1.082963 0.215803 10.943213 +v -1.095423 0.216219 10.947667 +v -1.107193 0.216782 10.953702 +v -1.11807 0.217484 10.961215 +v -1.12787 0.218311 10.970078 +v -1.136424 0.219251 10.980138 +v -1.143586 0.220286 10.991224 +v -1.149234 0.2214 11.003146 +v -1.15327 0.222572 11.0157 +v -1.155626 0.223783 11.028671 +v -1.156262 0.225013 11.041837 +v -1.155166 0.22624 11.054973 +v -1.152357 0.227443 11.067855 +v -1.147883 0.228601 11.080261 +v -1.141822 0.229696 11.091979 +v -1.134276 0.230707 11.10281 +v -1.125375 0.231618 11.112567 +v -1.115271 0.232414 11.121084 +v -1.104137 0.23308 11.128215 +v -1.092163 0.233605 11.133838 +v -1.079555 0.23398 11.137857 +v -1.066527 0.234199 11.140203 +v -1.053304 0.234258 11.140836 +v -1.04011 0.234156 11.139744 +v -1.027173 0.233895 11.136948 +v -1.014713 0.233479 11.132494 +v -1.002943 0.232916 11.126459 +v -0.992065 0.232214 11.118946 +v -0.982266 0.231386 11.110083 +v -0.973712 0.230447 11.100023 +v -0.96655 0.229412 11.088937 +v -0.960902 0.228298 11.077015 +v -0.956866 0.227126 11.064461 +v -0.95451 0.225914 11.05149 +v -0.953874 0.224685 11.038324 +v -0.95497 0.223458 11.025188 +v -0.957779 0.222255 11.012306 +v -0.962252 0.221097 10.9999 +v -0.968314 0.220002 10.988182 +v -0.97586 0.218991 10.977351 +v -0.984761 0.218079 10.967594 +v -0.994865 0.217284 10.959077 +v -1.005999 0.216618 10.951946 +v -1.017973 0.216093 10.946323 +v -1.030581 0.215718 10.942304 +v -1.043609 0.215499 10.939958 +v -1.062267 0.656322 10.857701 +v -1.049126 0.656237 10.856615 +v -1.075154 0.656541 10.860488 +v -1.087565 0.656889 10.864928 +v -1.099289 0.657361 10.870945 +v -1.110125 0.657948 10.878436 +v -1.119887 0.658641 10.887273 +v -1.128409 0.659428 10.8973055 +v -1.135544 0.660295 10.9083605 +v -1.141171 0.661227 10.920249 +v -1.145194 0.662208 10.932768 +v -1.147542 0.663223 10.945704 +v -1.148177 0.664252 10.958834 +v -1.147088 0.66528 10.971935 +v -1.144292 0.666287 10.984782 +v -1.139839 0.667257 10.997156 +v -1.133803 0.668174 11.008844 +v -1.126289 0.669021 11.019646 +v -1.117425 0.669784 11.029379 +v -1.107362 0.67045 11.037875 +v -1.096273 0.671008 11.044988 +v -1.084348 0.671448 11.050598 +v -1.07179 0.671762 11.054608 +v -1.058815 0.671946 11.056949 +v -1.045644 0.671996 11.057582 +v -1.032503 0.67191 11.056496 +v -1.019616 0.671692 11.053709 +v -1.007205 0.671344 11.049269 +v -0.995481 0.670872 11.043252 +v -0.984645 0.670285 11.035761 +v -0.974883 0.669592 11.026924 +v -0.966361 0.668805 11.016892 +v -0.959226 0.667938 11.005837 +v -0.953599 0.667006 10.993948 +v -0.949577 0.666024 10.981429 +v -0.947228 0.66501 10.968493 +v -0.946593 0.66398 10.955363 +v -0.947682 0.662953 10.942262 +v -0.950478 0.661946 10.929415 +v -0.954932 0.660975 10.917041 +v -0.960967 0.660059 10.9053545 +v -0.968481 0.659212 10.894551 +v -0.977345 0.658449 10.884818 +v -0.987408 0.657782 10.876323 +v -0.998497 0.657225 10.869209 +v -1.010422 0.656785 10.863599 +v -1.02298 0.65647 10.859591 +v -1.035955 0.656287 10.857248 +v -1.04677 1.103348 10.871432 +v -1.033737 1.103264 10.870359 +v -1.059551 1.103565 10.874192 +v -1.071862 1.103912 10.8785925 +v -1.083491 1.104381 10.884555 +v -1.09424 1.104965 10.891981 +v -1.103924 1.105655 10.900743 +v -1.112379 1.106438 10.910688 +v -1.119459 1.1073 10.921649 +v -1.125044 1.108228 10.933438 +v -1.129037 1.109205 10.945853 +v -1.13137 1.110214 10.958681 +v -1.132004 1.111239 10.971702 +v -1.130928 1.112262 10.984695 +v -1.12816 1.113264 10.9974375 +v -1.123747 1.11423 11.00971 +v -1.117765 1.115142 11.021303 +v -1.110316 1.115986 11.032019 +v -1.101528 1.116745 11.041673 +v -1.091551 1.117409 11.050102 +v -1.080556 1.117964 11.05716 +v -1.068731 1.118402 11.062728 +v -1.056278 1.118716 11.066708 +v -1.04341 1.118899 11.069036 +v -1.030348 1.118948 11.069667 +v -1.017315 1.118864 11.068594 +v -1.004534 1.118647 11.065834 +v -0.992223 1.118301 11.061435 +v -0.980594 1.117831 11.055471 +v -0.969845 1.117247 11.048045 +v -0.960161 1.116557 11.039284 +v -0.951706 1.115775 11.029338 +v -0.944626 1.114912 11.018377 +v -0.939041 1.113984 11.006588 +v -0.935048 1.113007 10.994174 +v -0.932715 1.111998 10.981346 +v -0.932081 1.110973 10.968324 +v -0.933157 1.109951 10.955331 +v -0.935925 1.108948 10.942589 +v -0.940338 1.107982 10.930316 +v -0.94632 1.10707 10.918723 +v -0.953769 1.106227 10.908007 +v -0.962557 1.105467 10.898353 +v -0.972534 1.104803 10.889924 +v -0.983529 1.104248 10.882866 +v -0.995354 1.10381 10.877299 +v -1.007807 1.103497 10.873318 +v -1.020675 1.103314 10.870991 +v -1.023521 1.523465 10.792858 +v -1.010651 1.523143 10.791852 +v -1.036143 1.524298 10.795456 +v -1.048301 1.525626 10.7996 +v -1.059787 1.527427 10.805219 +v -1.070404 1.52967 10.812219 +v -1.079971 1.532317 10.820478 +v -1.088325 1.535322 10.829856 +v -1.095321 1.538634 10.840192 +v -1.100841 1.542197 10.851309 +v -1.10479 1.545949 10.863017 +v -1.1071 1.549826 10.875116 +v -1.107733 1.553762 10.887398 +v -1.106676 1.55769 10.899655 +v -1.103949 1.561542 10.9116745 +v -1.099597 1.565252 10.923252 +v -1.093696 1.568758 10.93419 +v -1.086346 1.571998 10.944301 +v -1.077673 1.574918 10.953412 +v -1.067825 1.577467 10.961367 +v -1.056971 1.579602 10.96803 +v -1.045297 1.581287 10.973286 +v -1.033003 1.582492 10.977047 +v -1.020298 1.583197 10.979247 +v -1.0074 1.58339 10.979849 +v -0.99453 1.583067 10.978843 +v -0.981908 1.582235 10.976246 +v -0.96975 1.580907 10.972102 +v -0.958264 1.579106 10.966482 +v -0.947647 1.576863 10.959483 +v -0.938079 1.574216 10.951223 +v -0.929726 1.571211 10.941845 +v -0.92273 1.567898 10.93151 +v -0.91721 1.564336 10.920392 +v -0.913261 1.560584 10.908684 +v -0.91095 1.556706 10.896585 +v -0.910318 1.55277 10.884303 +v -0.911374 1.548843 10.872047 +v -0.914102 1.544991 10.860027 +v -0.918454 1.54128 10.848449 +v -0.924355 1.537775 10.837511 +v -0.931705 1.534535 10.8274 +v -0.940378 1.531615 10.818289 +v -0.950225 1.529066 10.810334 +v -0.961079 1.526931 10.803672 +v -0.972753 1.525246 10.798415 +v -0.985048 1.524041 10.794654 +v -0.997753 1.523336 10.792454 +v -0.992515 1.927225 10.606703 +v -0.979864 1.926882 10.605732 +v -1.004922 1.928116 10.609223 +v -1.016875 1.929539 10.613248 +v -1.028168 1.93147 10.618709 +v -1.038608 1.933875 10.625514 +v -1.048017 1.936714 10.633545 +v -1.056233 1.939939 10.642666 +v -1.063117 1.943493 10.6527195 +v -1.06855 1.947316 10.663534 +v -1.072439 1.951343 10.674924 +v -1.074718 1.955504 10.686696 +v -1.075348 1.959729 10.698648 +v -1.074318 1.963946 10.710575 +v -1.071645 1.968081 10.722273 +v -1.067376 1.972065 10.733542 +v -1.061583 1.975829 10.744189 +v -1.054366 1.979309 10.754033 +v -1.045848 1.982445 10.762904 +v -1.036174 1.985184 10.77065 +v -1.025511 1.987478 10.77714 +v -1.01404 1.989289 10.782263 +v -1.001959 1.990585 10.785929 +v -0.989473 1.991345 10.788078 +v -0.976796 1.991555 10.788672 +v -0.964146 1.991211 10.787701 +v -0.951739 1.99032 10.785181 +v -0.939786 1.988898 10.781157 +v -0.928493 1.986967 10.775694 +v -0.918053 1.984561 10.768889 +v -0.908644 1.981722 10.760859 +v -0.900427 1.978498 10.751739 +v -0.893544 1.974944 10.741684 +v -0.888111 1.97112 10.73087 +v -0.884221 1.967094 10.719479 +v -0.881942 1.962932 10.707707 +v -0.881313 1.958707 10.695756 +v -0.882343 1.954491 10.683829 +v -0.885016 1.950355 10.672132 +v -0.889285 1.946371 10.660862 +v -0.895078 1.942607 10.650214 +v -0.902295 1.939127 10.640371 +v -0.910813 1.935991 10.6315 +v -0.920487 1.933253 10.623754 +v -0.93115 1.930958 10.617263 +v -0.94262 1.929148 10.612141 +v -0.954702 1.927851 10.608474 +v -0.967188 1.927092 10.606325 +v -0.953748 2.360817 10.499048 +v -0.941377 2.360478 10.49811 +v -0.965884 2.361701 10.501496 +v -0.977576 2.363117 10.505414 +v -0.988624 2.365038 10.510733 +v -0.99884 2.367434 10.517364 +v -1.008048 2.370261 10.52519 +v -1.016091 2.373474 10.534081 +v -1.022831 2.377015 10.543883 +v -1.028153 2.380825 10.554428 +v -1.031966 2.384838 10.565537 +v -1.034205 2.388986 10.577019 +v -1.034831 2.393198 10.588677 +v -1.033834 2.397402 10.600313 +v -1.03123 2.401526 10.611726 +v -1.027065 2.405499 10.622722 +v -1.02141 2.409253 10.633113 +v -1.01436 2.412724 10.642721 +v -1.006038 2.415853 10.6513815 +v -0.996585 2.418585 10.658946 +v -0.986163 2.420876 10.665285 +v -0.97495 2.422684 10.67029 +v -0.963138 2.42398 10.673877 +v -0.95093 2.424741 10.675982 +v -0.938534 2.424953 10.676571 +v -0.926163 2.424614 10.675633 +v -0.914027 2.42373 10.673185 +v -0.902335 2.422315 10.669267 +v -0.891287 2.420393 10.663948 +v -0.881072 2.417998 10.657318 +v -0.871864 2.41517 10.649491 +v -0.863821 2.411958 10.6406 +v -0.85708 2.408416 10.630798 +v -0.851758 2.404606 10.620253 +v -0.847945 2.400593 10.609144 +v -0.845706 2.396445 10.597662 +v -0.84508 2.392233 10.586004 +v -0.846077 2.388029 10.5743685 +v -0.848681 2.383905 10.562955 +v -0.852846 2.379933 10.551959 +v -0.858502 2.376178 10.541568 +v -0.865551 2.372707 10.5319605 +v -0.873874 2.369579 10.5233 +v -0.883327 2.366846 10.515736 +v -0.893749 2.364555 10.509396 +v -0.904961 2.362747 10.504391 +v -0.916773 2.361451 10.500805 +v -0.928981 2.360691 10.498699 +v -0.907221 2.747275 10.315742 +v -0.89519 2.746748 10.314942 +v -0.919024 2.748664 10.317843 +v -0.930397 2.75089 10.321213 +v -0.941146 2.753914 10.325793 +v -0.951086 2.757686 10.331504 +v -0.960048 2.762141 10.338249 +v -0.967878 2.767202 10.345913 +v -0.974442 2.772784 10.354363 +v -0.979628 2.778789 10.363457 +v -0.983347 2.785117 10.373037 +v -0.985536 2.791657 10.382941 +v -0.986158 2.7983 10.392998 +v -0.9852 2.80493 10.403037 +v -0.982681 2.811434 10.412886 +v -0.978642 2.817702 10.422376 +v -0.973154 2.823626 10.431345 +v -0.966309 2.829104 10.439639 +v -0.958226 2.834042 10.447118 +v -0.949042 2.838358 10.453651 +v -0.938914 2.841975 10.459129 +v -0.928017 2.844833 10.463456 +v -0.916535 2.846883 10.46656 +v -0.904667 2.848089 10.468387 +v -0.892614 2.848432 10.468905 +v -0.880583 2.847904 10.468106 +v -0.86878 2.846515 10.466004 +v -0.857407 2.84429 10.462634 +v -0.846659 2.841265 10.458055 +v -0.836719 2.837493 10.452342 +v -0.827757 2.833038 10.445597 +v -0.819927 2.827977 10.437934 +v -0.813362 2.822396 10.429483 +v -0.808176 2.81639 10.42039 +v -0.804457 2.810063 10.4108095 +v -0.802268 2.803522 10.400906 +v -0.801647 2.79688 10.390848 +v -0.802604 2.79025 10.380809 +v -0.805124 2.783745 10.370961 +v -0.809162 2.777477 10.36147 +v -0.814651 2.771554 10.352501 +v -0.821495 2.766076 10.344207 +v -0.829579 2.761137 10.336729 +v -0.838763 2.756822 10.330195 +v -0.84889 2.753204 10.324718 +v -0.859788 2.750346 10.32039 +v -0.871269 2.748296 10.3172865 +v -0.883138 2.74709 10.31546 +v -0.852937 3.079329 10.026087 +v -0.841314 3.078768 10.02537 +v -0.864342 3.080819 10.027994 +v -0.875333 3.083213 10.031058 +v -0.885722 3.086469 10.035226 +v -0.895332 3.090532 10.040427 +v -0.903999 3.095333 10.046572 +v -0.911574 3.10079 10.053556 +v -0.917927 3.106808 10.061259 +v -0.922949 3.113285 10.0695505 +v -0.926556 3.120111 10.078286 +v -0.928684 3.127168 10.087318 +v -0.929298 3.134335 10.096493 +v -0.928388 3.141491 10.105652 +v -0.925968 3.148512 10.114638 +v -0.92208 3.155279 10.123299 +v -0.91679 3.161675 10.131487 +v -0.91019 3.167592 10.13906 +v -0.902392 3.172928 10.145889 +v -0.89353 3.177591 10.151858 +v -0.883754 3.181502 10.156864 +v -0.873233 3.184594 10.160822 +v -0.862147 3.186815 10.163664 +v -0.850684 3.188125 10.165341 +v -0.839042 3.188503 10.165825 +v -0.827419 3.187943 10.165107 +v -0.816015 3.186453 10.1632 +v -0.805024 3.184059 10.160137 +v -0.794634 3.180803 10.155969 +v -0.785024 3.176739 10.150768 +v -0.776358 3.171938 10.144623 +v -0.768783 3.166482 10.137639 +v -0.76243 3.160464 10.129936 +v -0.757407 3.153987 10.121645 +v -0.753801 3.147161 10.112909 +v -0.751673 3.140104 10.103876 +v -0.751058 3.132936 10.094702 +v -0.751969 3.125781 10.085543 +v -0.754389 3.11876 10.076556 +v -0.758277 3.111993 10.067895 +v -0.763566 3.105596 10.059708 +v -0.770166 3.09968 10.052135 +v -0.777964 3.094344 10.045306 +v -0.786827 3.089681 10.039337 +v -0.796602 3.08577 10.034331 +v -0.807123 3.082677 10.030373 +v -0.81821 3.080457 10.027531 +v -0.829672 3.079147 10.025854 +v -0.790915 3.445166 9.775621 +v -0.779775 3.444604 9.774974 +v -0.801848 3.446676 9.77736 +v -0.812386 3.449108 9.780163 +v -0.82235 3.452421 9.78398 +v -0.83157 3.456559 9.788747 +v -0.839886 3.46145 9.794382 +v -0.847157 3.46701 9.800788 +v -0.853259 3.473145 9.807856 +v -0.858087 3.47975 9.815466 +v -0.861559 3.486711 9.823486 +v -0.863614 3.49391 9.83178 +v -0.864219 3.501223 9.840205 +v -0.863362 3.508525 9.8486185 +v -0.861059 3.515692 9.856875 +v -0.857348 3.5226 9.864833 +v -0.852293 3.529131 9.872358 +v -0.845981 3.535174 9.879321 +v -0.83852 3.540625 9.885601 +v -0.830037 3.545392 9.891092 +v -0.820677 3.549391 9.895701 +v -0.810601 3.552556 9.899347 +v -0.799981 3.554832 9.901968 +v -0.788999 3.556179 9.903522 +v -0.777843 3.556575 9.903977 +v -0.766703 3.556014 9.90333 +v -0.75577 3.554504 9.901591 +v -0.745231 3.552072 9.898788 +v -0.735267 3.548758 9.894971 +v -0.726048 3.544621 9.890204 +v -0.717732 3.53973 9.884569 +v -0.71046 3.534169 9.878163 +v -0.704358 3.528034 9.871095 +v -0.69953 3.52143 9.863485 +v -0.696059 3.514468 9.855465 +v -0.694003 3.50727 9.847171 +v -0.693399 3.499957 9.838746 +v -0.694255 3.492654 9.830333 +v -0.696559 3.485488 9.822077 +v -0.70027 3.47858 9.814118 +v -0.705324 3.472049 9.806593 +v -0.711636 3.466006 9.79963 +v -0.719098 3.460554 9.79335 +v -0.727581 3.455788 9.787859 +v -0.73694 3.451788 9.78325 +v -0.747016 3.448624 9.779604 +v -0.757636 3.446348 9.776983 +v -0.768618 3.445 9.77543 +v -0.721201 3.736767 9.466451 +v -0.710632 3.736094 9.466028 +v -0.731577 3.738602 9.467604 +v -0.74158 3.741568 9.469469 +v -0.751041 3.745614 9.472013 +v -0.759797 3.750671 9.475192 +v -0.767698 3.756652 9.478952 +v -0.77461 3.763455 9.483229 +v -0.780414 3.770963 9.48795 +v -0.78501 3.779049 9.493033 +v -0.788321 3.787573 9.498392 +v -0.790288 3.79639 9.503936 +v -0.79088 3.80535 9.509568 +v -0.790085 3.814298 9.515194 +v -0.787918 3.823081 9.520716 +v -0.784414 3.83155 9.52604 +v -0.779635 3.83956 9.531076 +v -0.773662 3.846972 9.535736 +v -0.766597 3.853662 9.539942 +v -0.758561 3.859513 9.543621 +v -0.749692 3.864426 9.54671 +v -0.740141 3.868318 9.549156 +v -0.730072 3.87112 9.550918 +v -0.719657 3.872786 9.551965 +v -0.709074 3.873287 9.55228 +v -0.698505 3.872614 9.551857 +v -0.68813 3.870779 9.550703 +v -0.678126 3.867813 9.548839 +v -0.668665 3.863767 9.546295 +v -0.659909 3.85871 9.543116 +v -0.652008 3.852729 9.539356 +v -0.645096 3.845926 9.535079 +v -0.639292 3.838418 9.530358 +v -0.634696 3.830332 9.525275 +v -0.631386 3.821808 9.519915 +v -0.629418 3.812991 9.514372 +v -0.628826 3.804031 9.508739 +v -0.629621 3.795083 9.503114 +v -0.631789 3.7863 9.497592 +v -0.635292 3.777831 9.492267 +v -0.640071 3.769821 9.487232 +v -0.646044 3.762409 9.482571 +v -0.653109 3.755719 9.478366 +v -0.661145 3.749868 9.474687 +v -0.670014 3.744955 9.471598 +v -0.679565 3.741063 9.469152 +v -0.689634 3.738261 9.46739 +v -0.700049 3.736595 9.466342 +v -0.64392 3.895637 9.069299 +v -0.634034 3.894945 9.069088 +v -0.653627 3.897557 9.069884 +v -0.662989 3.900673 9.070834 +v -0.671846 3.904931 9.072132 +v -0.680046 3.910258 9.073757 +v -0.687449 3.916564 9.075679 +v -0.693928 3.923739 9.077867 +v -0.699372 3.931663 9.080283 +v -0.703689 3.940198 9.082885 +v -0.706804 3.949199 9.08563 +v -0.708664 3.958512 9.08847 +v -0.709238 3.967978 9.091356 +v -0.708515 3.977435 9.094239 +v -0.706507 3.98672 9.09707 +v -0.70325 3.995675 9.0998 +v -0.698798 4.004147 9.102384 +v -0.693229 4.01199 9.104775 +v -0.686637 4.019071 9.106934 +v -0.679135 4.025269 9.108824 +v -0.670851 4.030477 9.110412 +v -0.661928 4.034606 9.111671 +v -0.652518 4.037585 9.112579 +v -0.642781 4.039365 9.113122 +v -0.632885 4.039913 9.113289 +v -0.622999 4.039221 9.113078 +v -0.613292 4.037301 9.112492 +v -0.60393 4.034185 9.111542 +v -0.595073 4.029927 9.110244 +v -0.586873 4.0246 9.10862 +v -0.57947 4.018295 9.106697 +v -0.572991 4.011119 9.104509 +v -0.567546 4.003195 9.102094 +v -0.56323 3.99466 9.099491 +v -0.560115 3.985659 9.096747 +v -0.558255 3.976346 9.093907 +v -0.557681 3.96688 9.091021 +v -0.558404 3.957424 9.088138 +v -0.560412 3.948138 9.085306 +v -0.563669 3.939183 9.082576 +v -0.568121 3.930712 9.079993 +v -0.57369 3.922868 9.077601 +v -0.580282 3.915787 9.075442 +v -0.587784 3.909589 9.073553 +v -0.596068 3.904382 9.071965 +v -0.604991 3.900253 9.070706 +v -0.614401 3.897273 9.069797 +v -0.624138 3.895494 9.069255 +v -0.57768 -3.93741 8.887324 +v -0.569235 -3.935914 8.891252 +v -0.585964 -3.940083 8.883693 +v -0.593944 -3.943888 8.880419 +v -0.601483 -3.948759 8.87756 +v -0.608452 -3.954613 8.875165 +v -0.614733 -3.96135 8.873273 +v -0.620217 -3.968855 8.871918 +v -0.624811 -3.976999 8.871123 +v -0.628437 -3.985643 8.870901 +v -0.631032 -3.994639 8.871256 +v -0.632551 -4.003833 8.872183 +v -0.63297 -4.013068 8.873664 +v -0.63228 -4.022186 8.875676 +v -0.630494 -4.03103 8.878183 +v -0.627642 -4.03945 8.881142 +v -0.623772 -4.047301 8.884504 +v -0.618952 -4.054449 8.888209 +v -0.613263 -4.060772 8.892196 +v -0.606803 -4.066162 8.896396 +v -0.599683 -4.070526 8.900736 +v -0.592024 -4.073789 8.905144 +v -0.583957 -4.075896 8.909542 +v -0.57562 -4.076811 8.913857 +v -0.567157 -4.076519 8.918013 +v -0.558711 -4.075023 8.921941 +v -0.550427 -4.07235 8.925573 +v -0.542448 -4.068545 8.928846 +v -0.534909 -4.063674 8.931705 +v -0.527939 -4.05782 8.934101 +v -0.521658 -4.051083 8.935992 +v -0.516174 -4.043578 8.937347 +v -0.51158 -4.035434 8.938142 +v -0.507954 -4.02679 8.938364 +v -0.505359 -4.017794 8.938009 +v -0.50384 -4.0086 8.937083 +v -0.503421 -3.999365 8.935601 +v -0.504111 -3.990247 8.93359 +v -0.505897 -3.981403 8.931083 +v -0.508749 -3.972983 8.928123 +v -0.512619 -3.965132 8.924762 +v -0.517439 -3.957983 8.921056 +v -0.523128 -3.95166 8.917069 +v -0.529588 -3.946271 8.912869 +v -0.536708 -3.941907 8.908529 +v -0.544367 -3.938644 8.904122 +v -0.552434 -3.936536 8.899723 +v -0.560771 -3.935621 8.895409 +v -0.463619 -3.974174 8.716454 +v -0.456719 -3.972427 8.721816 +v -0.470373 -3.977031 8.711396 +v -0.476867 -3.980949 8.706727 +v -0.48299 -3.985861 8.702527 +v -0.488637 -3.991683 8.69887 +v -0.49371 -3.998316 8.695816 +v -0.498124 -4.005646 8.693419 +v -0.501802 -4.013547 8.691719 +v -0.504683 -4.021884 8.690746 +v -0.506716 -4.030515 8.690516 +v -0.507867 -4.039292 8.691033 +v -0.508115 -4.048065 8.692288 +v -0.507458 -4.056683 8.69426 +v -0.505906 -4.065 8.696915 +v -0.503485 -4.072873 8.700207 +v -0.500237 -4.080167 8.704081 +v -0.496218 -4.086757 8.70847 +v -0.491496 -4.092531 8.713298 +v -0.486153 -4.09739 8.718484 +v -0.480279 -4.101251 8.723939 +v -0.473975 -4.104047 8.7295685 +v -0.467349 -4.105732 8.735277 +v -0.460515 -4.106275 8.740966 +v -0.453588 -4.105668 8.74654 +v -0.446689 -4.103921 8.751902 +v -0.439934 -4.101064 8.75696 +v -0.43344 -4.097146 8.761629 +v -0.427317 -4.092234 8.765828 +v -0.421671 -4.086412 8.769486 +v -0.416597 -4.079779 8.772539 +v -0.412184 -4.072449 8.774937 +v -0.408505 -4.064548 8.776636 +v -0.405625 -4.056211 8.77761 +v -0.403592 -4.04758 8.77784 +v -0.402441 -4.038803 8.777323 +v -0.402192 -4.03003 8.776068 +v -0.40285 -4.021412 8.774096 +v -0.404402 -4.013095 8.771441 +v -0.406823 -4.005222 8.768148 +v -0.41007 -3.997928 8.764275 +v -0.414089 -3.991338 8.759886 +v -0.418811 -3.985564 8.755057 +v -0.424155 -3.980705 8.749872 +v -0.430029 -3.976844 8.744417 +v -0.436332 -3.974048 8.738788 +v -0.442958 -3.972363 8.733079 +v -0.449793 -3.97182 8.72739 +v -0.311561 -4.004487 8.565264 +v -0.306119 -4.002581 8.571455 +v -0.316873 -4.007444 8.559383 +v -0.321966 -4.0114 8.553912 +v -0.326752 -4.016289 8.548946 +v -0.331149 -4.022026 8.544569 +v -0.335083 -4.028513 8.540856 +v -0.338485 -4.035639 8.53787 +v -0.341298 -4.043283 8.535663 +v -0.343473 -4.051313 8.534272 +v -0.344974 -4.059592 8.533722 +v -0.345774 -4.067979 8.534021 +v -0.345859 -4.076329 8.535164 +v -0.34523 -4.084501 8.537133 +v -0.343895 -4.092354 8.539892 +v -0.341878 -4.099754 8.543396 +v -0.339214 -4.106574 8.547584 +v -0.335948 -4.112697 8.552384 +v -0.332136 -4.11802 8.557715 +v -0.327843 -4.12245 8.563484 +v -0.323143 -4.125912 8.569594 +v -0.318116 -4.128347 8.57594 +v -0.312848 -4.129713 8.582413 +v -0.307429 -4.129986 8.588902 +v -0.301952 -4.129163 8.595297 +v -0.29651 -4.127256 8.601488 +v -0.291198 -4.124299 8.607369 +v -0.286105 -4.120343 8.61284 +v -0.281319 -4.115454 8.617806 +v -0.276922 -4.109717 8.622183 +v -0.272988 -4.10323 8.625897 +v -0.269586 -4.096104 8.628882 +v -0.266773 -4.08846 8.631089 +v -0.264598 -4.08043 8.63248 +v -0.263097 -4.072151 8.633031 +v -0.262297 -4.063764 8.632731 +v -0.262212 -4.055414 8.631588 +v -0.262841 -4.047242 8.629619 +v -0.264176 -4.039389 8.62686 +v -0.266193 -4.031989 8.623356 +v -0.268857 -4.025169 8.619168 +v -0.272123 -4.019046 8.614368 +v -0.275935 -4.013723 8.609037 +v -0.280228 -4.009293 8.603268 +v -0.284928 -4.005831 8.597158 +v -0.289955 -4.003396 8.590812 +v -0.295223 -4.00203 8.584339 +v -0.300642 -4.001757 8.57785 +v -0.128212 -4.02827 8.436094 +v -0.124086 -4.026261 8.442746 +v -0.132227 -4.03128 8.429759 +v -0.13606 -4.035236 8.423849 +v -0.139646 -4.040073 8.418465 +v -0.142925 -4.045707 8.413699 +v -0.145839 -4.052041 8.409633 +v -0.14834 -4.058968 8.406337 +v -0.150383 -4.066369 8.403866 +v -0.151935 -4.074117 8.402263 +v -0.152969 -4.08208 8.401557 +v -0.153466 -4.090121 8.401757 +v -0.15342 -4.098103 8.402862 +v -0.152829 -4.105889 8.404852 +v -0.151705 -4.113347 8.407694 +v -0.150067 -4.120348 8.411338 +v -0.147942 -4.126772 8.415722 +v -0.145368 -4.13251 8.420771 +v -0.142387 -4.137464 8.4264 +v -0.139052 -4.141548 8.432511 +v -0.135418 -4.144694 8.439 +v -0.131549 -4.146846 8.445756 +v -0.127511 -4.147969 8.452663 +v -0.123372 -4.148043 8.459603 +v -0.119204 -4.147066 8.466458 +v -0.115077 -4.145056 8.47311 +v -0.111063 -4.142047 8.479446 +v -0.10723 -4.138091 8.485356 +v -0.103644 -4.133254 8.49074 +v -0.100365 -4.12762 8.495506 +v -0.097451 -4.121286 8.499571 +v -0.09495 -4.114359 8.502868 +v -0.092907 -4.106958 8.505338 +v -0.091355 -4.09921 8.506941 +v -0.090321 -4.091247 8.507648 +v -0.089824 -4.083206 8.507447 +v -0.08987 -4.075224 8.506342 +v -0.090461 -4.067437 8.504352 +v -0.091585 -4.05998 8.501511 +v -0.093223 -4.052979 8.497867 +v -0.095348 -4.046555 8.493482 +v -0.097922 -4.040817 8.488433 +v -0.100903 -4.035863 8.482805 +v -0.104238 -4.031779 8.476694 +v -0.107872 -4.028633 8.470205 +v -0.11174 -4.026481 8.4634495 +v -0.115779 -4.025358 8.456542 +v -0.119918 -4.025284 8.449601 +v 0.081883 -4.045196 8.331348 +v 0.084821 -4.043127 8.338247 +v 0.079039 -4.048223 8.324771 +v 0.076338 -4.052157 8.318629 +v 0.073827 -4.056928 8.313027 +v 0.071548 -4.062457 8.308061 +v 0.06954 -4.068649 8.303815 +v 0.067839 -4.075396 8.300364 +v 0.066471 -4.082585 8.297765 +v 0.065462 -4.090092 8.296063 +v 0.064829 -4.097789 8.295287 +v 0.064582 -4.105543 8.295451 +v 0.064725 -4.113223 8.296551 +v 0.065256 -4.120697 8.298569 +v 0.066167 -4.127836 8.301471 +v 0.06744 -4.13452 8.305206 +v 0.069056 -4.140633 8.309711 +v 0.070985 -4.14607 8.314908 +v 0.073195 -4.15074 8.320709 +v 0.075649 -4.154561 8.327015 +v 0.078303 -4.157469 8.333717 +v 0.081113 -4.159414 8.340702 +v 0.084031 -4.160362 8.347848 +v 0.087007 -4.160298 8.355035 +v 0.08999 -4.159221 8.362139 +v 0.092928 -4.157152 8.369038 +v 0.095772 -4.154125 8.375615 +v 0.098472 -4.150192 8.381757 +v 0.100984 -4.14542 8.387359 +v 0.103263 -4.139891 8.392325 +v 0.10527 -4.1337 8.39657 +v 0.106972 -4.126952 8.400022 +v 0.108339 -4.119763 8.402621 +v 0.109348 -4.112256 8.404323 +v 0.109982 -4.104559 8.405099 +v 0.110229 -4.096805 8.404935 +v 0.110086 -4.089125 8.403835 +v 0.109554 -4.081652 8.401817 +v 0.108644 -4.074512 8.398915 +v 0.10737 -4.067829 8.39518 +v 0.105755 -4.061716 8.390675 +v 0.103826 -4.056278 8.385478 +v 0.101616 -4.051609 8.379676 +v 0.099162 -4.047787 8.373371 +v 0.096508 -4.044879 8.366668 +v 0.093697 -4.042935 8.359684 +v 0.090779 -4.041986 8.352538 +v 0.087804 -4.042051 8.345351 +v 0.31629 -4.054746 8.253257 +v 0.318144 -4.052653 8.260276 +v 0.314511 -4.057766 8.246564 +v 0.312838 -4.061663 8.240312 +v 0.3113 -4.066368 8.234608 +v 0.309923 -4.071802 8.22955 +v 0.308731 -4.077872 8.225224 +v 0.307743 -4.084473 8.221703 +v 0.306977 -4.091493 8.21905 +v 0.306446 -4.098812 8.217308 +v 0.30616 -4.106304 8.216507 +v 0.306122 -4.113842 8.216662 +v 0.306334 -4.121296 8.217769 +v 0.306792 -4.128538 8.219811 +v 0.307488 -4.135446 8.22275 +v 0.30841 -4.1419 8.226539 +v 0.309542 -4.14779 8.231111 +v 0.310866 -4.153016 8.236388 +v 0.312358 -4.157488 8.242281 +v 0.313993 -4.161129 8.248687 +v 0.315743 -4.163878 8.255499 +v 0.317578 -4.165686 8.262598 +v 0.319466 -4.166524 8.269865 +v 0.321376 -4.166377 8.277173 +v 0.323274 -4.165247 8.284399 +v 0.325129 -4.163154 8.291418 +v 0.326908 -4.160134 8.298111 +v 0.328581 -4.156237 8.304363 +v 0.330119 -4.151532 8.310067 +v 0.331496 -4.146098 8.315125 +v 0.332688 -4.140028 8.319452 +v 0.333676 -4.133427 8.322972 +v 0.334442 -4.126407 8.325626 +v 0.334972 -4.119088 8.327368 +v 0.335259 -4.111596 8.328168 +v 0.335297 -4.104058 8.328013 +v 0.335085 -4.096604 8.326906 +v 0.334627 -4.089362 8.324865 +v 0.333931 -4.082454 8.321925 +v 0.333009 -4.076 8.318136 +v 0.331877 -4.07011 8.313564 +v 0.330553 -4.064884 8.308287 +v 0.329061 -4.060412 8.302395 +v 0.327426 -4.056771 8.295988 +v 0.325676 -4.054022 8.289176 +v 0.323841 -4.052214 8.282077 +v 0.321952 -4.051376 8.274811 +v 0.320043 -4.051523 8.267502 +v 0.574763 -4.056227 8.203824 +v 0.575632 -4.054134 8.210886 +v 0.573951 -4.059229 8.197092 +v 0.573211 -4.063088 8.190804 +v 0.572554 -4.067738 8.185068 +v 0.571992 -4.073101 8.179982 +v 0.571535 -4.079083 8.175633 +v 0.57119 -4.085583 8.172096 +v 0.570964 -4.092489 8.169431 +v 0.57086 -4.099684 8.167683 +v 0.57088 -4.107044 8.1668825 +v 0.571024 -4.114443 8.167045 +v 0.571289 -4.121755 8.168165 +v 0.571671 -4.128854 8.170224 +v 0.572163 -4.13562 8.173187 +v 0.572756 -4.141935 8.177004 +v 0.573442 -4.147693 8.181609 +v 0.574207 -4.152795 8.186923 +v 0.575039 -4.157153 8.192855 +v 0.575923 -4.160693 8.199305 +v 0.576845 -4.163354 8.206161 +v 0.577789 -4.165091 8.213306 +v 0.578738 -4.165875 8.220618 +v 0.579676 -4.16569 8.227972 +v 0.580588 -4.164542 8.235242 +v 0.581457 -4.162449 8.242304 +v 0.582269 -4.159447 8.249036 +v 0.58301 -4.155588 8.255324 +v 0.583667 -4.150937 8.26106 +v 0.584229 -4.145575 8.266146 +v 0.584686 -4.139593 8.270495 +v 0.58503 -4.133093 8.274032 +v 0.585257 -4.126186 8.276697 +v 0.585361 -4.118992 8.278445 +v 0.585341 -4.111632 8.279244 +v 0.585197 -4.104233 8.279083 +v 0.584932 -4.096921 8.277963 +v 0.58455 -4.089822 8.275904 +v 0.584058 -4.083056 8.272941 +v 0.583464 -4.076741 8.269124 +v 0.582779 -4.070983 8.264519 +v 0.582014 -4.065881 8.259205 +v 0.581182 -4.061523 8.253272 +v 0.580297 -4.057983 8.246823 +v 0.579375 -4.055321 8.239967 +v 0.578432 -4.053584 8.232822 +v 0.577482 -4.052801 8.22551 +v 0.576544 -4.052986 8.218156 +v 0.811998 -4.049955 8.1882 +v 0.809128 -4.04796 8.195466 +v 0.814916 -4.052854 8.181264 +v 0.817888 -4.056605 8.174774 +v 0.82092 -4.061142 8.168837 +v 0.824015 -4.066387 8.163552 +v 0.827176 -4.072247 8.159004 +v 0.830405 -4.07862 8.155268 +v 0.833704 -4.085397 8.152404 +v 0.837071 -4.092459 8.150457 +v 0.840505 -4.099683 8.149457 +v 0.844003 -4.106946 8.149417 +v 0.847561 -4.11412 8.150333 +v 0.851175 -4.121081 8.152187 +v 0.854838 -4.127709 8.1549425 +v 0.858544 -4.13389 8.158549 +v 0.857922 -4.139638 8.163222 +v 0.855146 -4.144796 8.168744 +v 0.852388 -4.149217 8.174882 +v 0.849641 -4.152825 8.181536 +v 0.846895 -4.155561 8.188594 +v 0.844142 -4.15738 8.195941 +v 0.841371 -4.158251 8.203455 +v 0.838576 -4.158161 8.21101 +v 0.835747 -4.157113 8.218481 +v 0.832876 -4.155126 8.225744 +v 0.829959 -4.152236 8.232678 +v 0.826987 -4.148494 8.239169 +v 0.823956 -4.143965 8.245108 +v 0.820861 -4.138728 8.250399 +v 0.817701 -4.132874 8.254954 +v 0.814472 -4.126504 8.258699 +v 0.811174 -4.11973 8.261572 +v 0.807808 -4.112667 8.26353 +v 0.804375 -4.10544 8.264541 +v 0.800877 -4.098172 8.264593 +v 0.797319 -4.09099 8.263687 +v 0.793706 -4.084018 8.261842 +v 0.790043 -4.077377 8.259095 +v 0.786337 -4.071182 8.255495 +v 0.786958 -4.065423 8.250814 +v 0.789733 -4.060257 8.245279 +v 0.79249 -4.055832 8.239127 +v 0.795236 -4.052222 8.23246 +v 0.797981 -4.049487 8.225389 +v 0.800734 -4.047672 8.21803 +v 0.803504 -4.046807 8.210507 +v 0.806299 -4.046904 8.202943 +v -0.397074 -4.06102 9.119724 +v -0.611946 -4.034602 9.118879 +v -0.397077 -4.05871 9.125836 +v -0.397087 -4.05562 9.131592 +v -0.609771 -4.031575 9.125034 +v -0.397103 -4.051805 9.136897 +v -0.606274 -4.02793 9.130743 +v -0.397124 -4.047329 9.141658 +v -0.601996 -4.023683 9.13589 +v -0.397152 -4.042268 9.145794 +v -0.597343 -4.01887 9.140378 +v -0.397185 -4.03671 9.149234 +v -0.592606 -4.013552 9.144127 +v -0.397222 -4.03075 9.15192 +v -0.587986 -4.007809 9.14707 +v -0.397263 -4.024489 9.153806 +v -0.583628 -4.00173 9.14916 +v -0.397308 -4.018035 9.154859 +v -0.579635 -3.995416 9.150362 +v -0.397355 -4.011498 9.155061 +v -0.57608 -3.988972 9.15066 +v -0.397403 -4.004989 9.154409 +v -0.573009 -3.982507 9.15005 +v -0.397453 -3.998621 9.152915 +v -0.570448 -3.976132 9.148545 +v -0.397502 -3.992503 9.150602 +v -0.568399 -3.969959 9.1461735 +v -0.397551 -3.986738 9.147512 +v -0.566846 -3.964097 9.142976 +v -0.397598 -3.981426 9.143697 +v -0.565752 -3.958651 9.139008 +v -0.397642 -3.976657 9.139222 +v -0.565062 -3.953723 9.13434 +v -0.397683 -3.972513 9.134164 +v -0.564698 -3.949406 9.129053 +v -0.39772 -3.969065 9.128609 +v -0.564568 -3.945789 9.123239 +v -0.397753 -3.966372 9.122653 +v -0.564561 -3.942947 9.117 +v -0.397781 -3.964481 9.116397 +v -0.564559 -3.940946 9.110447 +v -0.397803 -3.963422 9.109949 +v -0.564442 -3.939838 9.103696 +v -0.397819 -3.963215 9.103418 +v -0.564101 -3.939658 9.096869 +v -0.397828 -3.963864 9.096917 +v -0.563451 -3.940421 9.090088 +v -0.397831 -3.965356 9.090556 +v -0.562448 -3.942122 9.083472 +v -0.397828 -3.967666 9.084445 +v -0.561094 -3.944733 9.077138 +v -0.397819 -3.970756 9.078688 +v -0.559446 -3.948201 9.071195 +v -0.397803 -3.974571 9.073384 +v -0.557602 -3.952457 9.065741 +v -0.397781 -3.979047 9.068623 +v -0.555693 -3.957411 9.060866 +v -0.397753 -3.984108 9.064487 +v -0.553868 -3.962961 9.056645 +v -0.39772 -3.989665 9.061046 +v -0.552277 -3.968996 9.053144 +v -0.397683 -3.995626 9.05836 +v -0.55106 -3.975397 9.050416 +v -0.397642 -4.001887 9.056474 +v -0.550344 -3.982043 9.048499 +v -0.397598 -4.008341 9.055421 +v -0.550234 -3.988811 9.047419 +v -0.397551 -4.014878 9.055219 +v -0.550814 -3.995577 9.047192 +v -0.397502 -4.021386 9.055871 +v -0.552142 -4.002222 9.047816 +v -0.397453 -4.027754 9.057366 +v -0.554254 -4.008629 9.04928 +v -0.397403 -4.033873 9.059678 +v -0.557162 -4.014686 9.051558 +v -0.397355 -4.039638 9.062769 +v -0.560853 -4.02029 9.054613 +v -0.397308 -4.04495 9.066584 +v -0.565289 -4.025345 9.058395 +v -0.570405 -4.029764 9.062844 +v -0.397263 -4.049719 9.071059 +v -0.397222 -4.053863 9.076117 +v -0.576105 -4.033472 9.067889 +v -0.397185 -4.057311 9.081671 +v -0.582255 -4.036411 9.073449 +v -0.397152 -4.060003 9.087628 +v -0.588674 -4.038535 9.079437 +v -0.397124 -4.061895 9.093883 +v -0.59511 -4.039821 9.085759 +v -0.397103 -4.062954 9.100332 +v -0.601211 -4.04027 9.092317 +v -0.397087 -4.06316 9.106863 +v -0.606494 -4.03991 9.099012 +v -0.397077 -4.062512 9.113364 +v -0.610356 -4.038801 9.105744 +v -0.120844 -4.045141 9.121519 +v -0.12084 -4.047391 9.115569 +v -0.120853 -4.042133 9.127125 +v -0.120869 -4.038417 9.13229 +v -0.12089 -4.034058 9.136925 +v -0.120917 -4.02913 9.140952 +v -0.120948 -4.023717 9.144302 +v -0.120985 -4.017913 9.146917 +v -0.121025 -4.011815 9.148753 +v -0.121068 -4.005529 9.149778 +v -0.121114 -3.999163 9.149975 +v -0.121161 -3.992824 9.149339 +v -0.121209 -3.986623 9.147883 +v -0.121258 -3.980663 9.145631 +v -0.121305 -3.975049 9.142622 +v -0.121351 -3.969875 9.138907 +v -0.121394 -3.96523 9.134549 +v -0.121434 -3.961194 9.129624 +v -0.12147 -3.957836 9.124215 +v -0.121502 -3.955213 9.118415 +v -0.121529 -3.953371 9.112323 +v -0.12155 -3.952339 9.106044 +v -0.121566 -3.952137 9.099685 +v -0.121575 -3.952768 9.093354 +v -0.121578 -3.954221 9.087161 +v -0.121575 -3.956471 9.081211 +v -0.121566 -3.959479 9.075605 +v -0.12155 -3.963195 9.07044 +v -0.121529 -3.967554 9.065805 +v -0.121502 -3.972482 9.061778 +v -0.12147 -3.977895 9.058428 +v -0.121434 -3.9837 9.055813 +v -0.121394 -3.989797 9.053977 +v -0.121351 -3.996083 9.052952 +v -0.121305 -4.002449 9.052755 +v -0.121258 -4.008788 9.053391 +v -0.121209 -4.01499 9.054847 +v -0.121161 -4.020949 9.057099 +v -0.121114 -4.026564 9.060108 +v -0.121068 -4.031737 9.063823 +v -0.121025 -4.036382 9.068181 +v -0.120985 -4.040418 9.073106 +v -0.120948 -4.043776 9.078515 +v -0.120917 -4.046399 9.084315 +v -0.12089 -4.048242 9.090407 +v -0.120869 -4.049273 9.096686 +v -0.120853 -4.049475 9.103045 +v -0.120844 -4.048844 9.109376 +v 0.158124 -4.022619 9.114332 +v 0.158127 -4.024761 9.108669 +v 0.158115 -4.019755 9.119666 +v 0.1581 -4.016218 9.124581 +v 0.15808 -4.012067 9.128992 +v 0.158054 -4.007374 9.132823 +v 0.158024 -4.002219 9.13601 +v 0.15799 -3.996691 9.138498 +v 0.157951 -3.990884 9.140243 +v 0.15791 -3.984897 9.141217 +v 0.157867 -3.978833 9.141403 +v 0.157821 -3.972796 9.140797 +v 0.157776 -3.966888 9.13941 +v 0.15773 -3.961212 9.137265 +v 0.157685 -3.955863 9.134399 +v 0.157641 -3.950934 9.130862 +v 0.1576 -3.94651 9.126714 +v 0.157562 -3.942664 9.122025 +v 0.157527 -3.939464 9.116876 +v 0.157497 -3.936965 9.111355 +v 0.157471 -3.935208 9.105557 +v 0.157451 -3.934224 9.099581 +v 0.157436 -3.934031 9.093528 +v 0.157427 -3.93463 9.087503 +v 0.157424 -3.936012 9.081609 +v 0.157427 -3.938154 9.075946 +v 0.157436 -3.941018 9.070612 +v 0.157451 -3.944556 9.065697 +v 0.157471 -3.948706 9.061286 +v 0.157497 -3.953399 9.057455 +v 0.157527 -3.958554 9.054268 +v 0.157562 -3.964082 9.05178 +v 0.1576 -3.969889 9.050035 +v 0.157641 -3.975876 9.049061 +v 0.157685 -3.98194 9.048875 +v 0.15773 -3.987977 9.049481 +v 0.157776 -3.993885 9.050868 +v 0.157821 -3.999561 9.053013 +v 0.157867 -4.00491 9.055879 +v 0.15791 -4.009839 9.059416 +v 0.157951 -4.014264 9.063564 +v 0.15799 -4.018109 9.068253 +v 0.158024 -4.021309 9.073402 +v 0.158054 -4.023808 9.078923 +v 0.15808 -4.025565 9.084721 +v 0.1581 -4.026549 9.090697 +v 0.158115 -4.026742 9.09675 +v 0.158124 -4.026143 9.102775 +v 0.439895 -3.999869 9.107077 +v 0.439898 -4.001903 9.1017 +v 0.439887 -3.997149 9.112143 +v 0.439873 -3.99379 9.116811 +v 0.439854 -3.989848 9.121 +v 0.439829 -3.985391 9.124638 +v 0.439801 -3.980496 9.127665 +v 0.439768 -3.975246 9.130027 +v 0.439731 -3.969731 9.131685 +v 0.439692 -3.964045 9.13261 +v 0.439651 -3.958287 9.132786 +v 0.439608 -3.952553 9.132211 +v 0.439565 -3.946943 9.130893 +v 0.439521 -3.941552 9.128857 +v 0.439478 -3.936473 9.126135 +v 0.439437 -3.931792 9.122776 +v 0.439398 -3.927589 9.118836 +v 0.439361 -3.923938 9.114383 +v 0.439328 -3.920899 9.109494 +v 0.4393 -3.918525 9.104251 +v 0.439275 -3.916857 9.098744 +v 0.439256 -3.915923 9.093069 +v 0.439242 -3.915738 9.087321 +v 0.439234 -3.916308 9.081599 +v 0.439231 -3.91762 9.076001 +v 0.439234 -3.919654 9.070624 +v 0.439242 -3.922374 9.065558 +v 0.439256 -3.925734 9.06089 +v 0.439275 -3.929676 9.056701 +v 0.4393 -3.934132 9.053062 +v 0.439328 -3.939028 9.050036 +v 0.439361 -3.944278 9.047674 +v 0.439398 -3.949793 9.046016 +v 0.439437 -3.955478 9.045091 +v 0.439478 -3.961237 9.044914 +v 0.439521 -3.966971 9.04549 +v 0.439565 -3.972581 9.046807 +v 0.439608 -3.977972 9.048844 +v 0.439651 -3.983051 9.051566 +v 0.439692 -3.987732 9.054925 +v 0.439731 -3.991934 9.058865 +v 0.439768 -3.995586 9.063318 +v 0.439801 -3.998625 9.068207 +v 0.439829 -4.000999 9.07345 +v 0.439854 -4.002667 9.078957 +v 0.439873 -4.003601 9.084632 +v 0.439887 -4.003785 9.09038 +v 0.439895 -4.003216 9.096102 +v 0.724471 -3.976893 9.099751 +v 0.724473 -3.978818 9.094661 +v 0.724462 -3.974319 9.104546 +v 0.724449 -3.971139 9.108963 +v 0.724431 -3.967408 9.112928 +v 0.724408 -3.96319 9.116372 +v 0.724381 -3.958556 9.119237 +v 0.72435 -3.953587 9.121473 +v 0.724315 -3.948367 9.123042 +v 0.724278 -3.942986 9.123917 +v 0.724239 -3.937535 9.124084 +v 0.724199 -3.932109 9.123539 +v 0.724157 -3.926799 9.122292 +v 0.724116 -3.921696 9.120365 +v 0.724076 -3.916889 9.117789 +v 0.724036 -3.912458 9.114609 +v 0.723999 -3.908481 9.11088 +v 0.723965 -3.905025 9.106666 +v 0.723934 -3.902149 9.102038 +v 0.723907 -3.899902 9.097075 +v 0.723884 -3.898323 9.091864 +v 0.723865 -3.897439 9.086492 +v 0.723852 -3.897264 9.081051 +v 0.723844 -3.897803 9.075636 +v 0.723841 -3.899045 9.070338 +v 0.723844 -3.90097 9.065248 +v 0.723852 -3.903545 9.060453 +v 0.723865 -3.906725 9.056035 +v 0.723884 -3.910456 9.052071 +v 0.723907 -3.914674 9.048626 +v 0.723934 -3.919307 9.045762 +v 0.723965 -3.924276 9.043526 +v 0.723999 -3.929496 9.041957 +v 0.724036 -3.934877 9.041081 +v 0.724076 -3.940328 9.040915 +v 0.724116 -3.945755 9.041459 +v 0.724157 -3.951065 9.042706 +v 0.724199 -3.956167 9.044634 +v 0.724239 -3.960975 9.04721 +v 0.724278 -3.965405 9.050389 +v 0.724315 -3.969382 9.054118 +v 0.72435 -3.972839 9.058333 +v 0.724381 -3.975715 9.062961 +v 0.724408 -3.977962 9.067923 +v 0.724431 -3.979541 9.073135 +v 0.724449 -3.980425 9.078507 +v 0.724462 -3.980599 9.083947 +v 0.724471 -3.980061 9.089363 +v 1.009563 -3.953875 9.092411 +v 1.011852 -3.955506 9.087553 +v 1.007269 -3.95163 9.096995 +v 1.00497 -3.948811 9.101228 +v 1.002667 -3.945468 9.105036 +v 1.000358 -3.941661 9.108357 +v 0.998045 -3.937458 9.111132 +v 0.995729 -3.932933 9.113315 +v 0.993408 -3.928167 9.114869 +v 0.991085 -3.923243 9.115768 +v 0.988759 -3.918248 9.115995 +v 0.986432 -3.913271 9.115549 +v 0.984103 -3.908399 9.114436 +v 0.981774 -3.90372 9.112676 +v 0.979446 -3.899316 9.1103 +v 0.977118 -3.895266 9.1073475 +v 0.974793 -3.891643 9.10387 +v 0.972469 -3.888511 9.099927 +v 0.970149 -3.885927 9.095588 +v 0.967832 -3.88394 9.090926 +v 0.96552 -3.882587 9.086022 +v 0.963212 -3.881894 9.080961 +v 0.960909 -3.881877 9.07583 +v 0.958612 -3.882539 9.070717 +v 0.95632 -3.883873 9.065712 +v 0.958612 -3.885559 9.060814 +v 0.960909 -3.887862 9.056201 +v 0.963212 -3.890739 9.051953 +v 0.96552 -3.894138 9.048139 +v 0.967832 -3.897997 9.044825 +v 0.970149 -3.902247 9.042064 +v 0.972469 -3.906812 9.039904 +v 0.974793 -3.911611 9.03838 +v 0.977118 -3.916558 9.037516 +v 0.979446 -3.921566 9.037325 +v 0.981774 -3.926547 9.03781 +v 0.984103 -3.931412 9.03896 +v 0.986432 -3.936076 9.040755 +v 0.988759 -3.940455 9.043161 +v 0.991085 -3.944473 9.046137 +v 0.993408 -3.948058 9.04963 +v 0.995729 -3.951147 9.053579 +v 0.998045 -3.953684 9.057916 +v 1.000358 -3.955624 9.062564 +v 1.002667 -3.95693 9.067443 +v 1.00497 -3.957579 9.072469 +v 1.007269 -3.957558 9.077554 +v 1.009563 -3.956863 9.082611 +v -0.52574 -3.237772 10.228887 +v -0.837585 -3.183058 10.170018 +v -0.525747 -3.230831 10.233611 +v -0.525768 -3.22333 10.237385 +v -0.83342 -3.177508 10.173946 +v -0.525802 -3.215397 10.240144 +v -0.827744 -3.171777 10.177353 +v -0.52585 -3.207168 10.241843 +v -0.821286 -3.165854 10.180046 +v -0.52591 -3.198784 10.242451 +v -0.814488 -3.159787 10.181902 +v -0.52598 -3.190389 10.241958 +v -0.807628 -3.153655 10.182846 +v -0.526061 -3.182125 10.240372 +v -0.800895 -3.147556 10.182835 +v -0.526151 -3.174135 10.237722 +v -0.794431 -3.141598 10.181855 +v -0.526247 -3.166555 10.234051 +v -0.788342 -3.135891 10.179915 +v -0.526349 -3.159514 10.2294235 +v -0.782709 -3.130546 10.177048 +v -0.777592 -3.12567 10.173306 +v -0.526454 -3.153134 10.223918 +v -0.526561 -3.147524 10.2176285 +v -0.773029 -3.121361 10.168762 +v -0.526668 -3.142779 10.210663 +v -0.769037 -3.117711 10.1635065 +v -0.765614 -3.114798 10.157646 +v -0.526774 -3.13898 10.20314 +v -0.526876 -3.136193 10.195189 +v -0.762736 -3.112688 10.151301 +v -0.526972 -3.134465 10.186946 +v -0.760362 -3.111432 10.144602 +v -0.527061 -3.133826 10.178552 +v -0.758434 -3.111064 10.137685 +v -0.527142 -3.134287 10.170151 +v -0.756879 -3.111605 10.130694 +v -0.527213 -3.13584 10.161885 +v -0.755619 -3.113055 10.123768 +v -0.527273 -3.138458 10.153897 +v -0.754567 -3.115403 10.117048 +v -0.52732 -3.142097 10.146324 +v -0.753644 -3.118617 10.110665 +v -0.527355 -3.146694 10.139294 +v -0.752781 -3.122654 10.104741 +v -0.527376 -3.152171 10.132929 +v -0.751927 -3.127452 10.099388 +v -0.527383 -3.158433 10.127337 +v -0.527376 -3.165374 10.122613 +v -0.750179 -3.139017 10.090764 +v -0.527355 -3.172876 10.118839 +v -0.749325 -3.14559 10.08764 +v -0.52732 -3.180808 10.116079 +v -0.74856 -3.152539 10.085376 +v -0.527273 -3.189037 10.114381 +v -0.747971 -3.159736 10.084003 +v -0.527213 -3.197421 10.113773 +v -0.747661 -3.167046 10.083535 +v -0.527142 -3.205817 10.114266 +v -0.747741 -3.174324 10.083967 +v -0.527061 -3.21408 10.115851 +v -0.74832 -3.181427 10.085276 +v -0.526972 -3.222071 10.118502 +v -0.749499 -3.188209 10.087426 +v -0.526876 -3.229651 10.122173 +v -0.751365 -3.194532 10.09036 +v -0.526774 -3.236691 10.126801 +v -0.753983 -3.200264 10.094009 +v -0.526668 -3.243071 10.132306 +v -0.757399 -3.205286 10.098291 +v -0.526561 -3.248682 10.138595 +v -0.761631 -3.209497 10.103109 +v -0.766673 -3.21281 10.108359 +v -0.526454 -3.253427 10.145561 +v -0.526349 -3.257226 10.153084 +v -0.772491 -3.215161 10.11393 +v -0.526247 -3.260013 10.161034 +v -0.779025 -3.216507 10.119708 +v -0.526151 -3.26174 10.169277 +v -0.786191 -3.216828 10.125576 +v -0.793875 -3.216127 10.131422 +v -0.526061 -3.262379 10.177671 +v -0.52598 -3.261918 10.186073 +v -0.801931 -3.21443 10.13714 +v -0.52591 -3.260365 10.194339 +v -0.81017 -3.211788 10.142636 +v -0.52585 -3.257747 10.202326 +v -0.81834 -3.20828 10.147838 +v -0.826066 -3.204015 10.152704 +v -0.525802 -3.254109 10.2099 +v -0.525768 -3.249512 10.216929 +v -0.832755 -3.199153 10.15725 +v -0.525747 -3.244035 10.223295 +v -0.837486 -3.193905 10.161576 +v -0.165556 -3.215627 10.213782 +v -0.165549 -3.22238 10.209186 +v -0.165576 -3.20833 10.217455 +v -0.16561 -3.200615 10.220143 +v -0.165656 -3.192612 10.221799 +v -0.165714 -3.184458 10.222395 +v -0.165783 -3.176295 10.221921 +v -0.165861 -3.16826 10.220385 +v -0.165948 -3.160492 10.2178135 +v -0.166042 -3.153123 10.21425 +v -0.166141 -3.146279 10.209755 +v -0.166243 -3.140079 10.204407 +v -0.166347 -3.134627 10.1982975 +v -0.166451 -3.130016 10.191528 +v -0.166554 -3.126327 10.184218 +v -0.166653 -3.123622 10.17649 +v -0.166746 -3.121947 10.168478 +v -0.166833 -3.121331 10.160318 +v -0.166912 -3.121784 10.152151 +v -0.16698 -3.1233 10.144115 +v -0.167038 -3.125851 10.136348 +v -0.167085 -3.129394 10.1289835 +v -0.167118 -3.133868 10.122147 +v -0.167139 -3.139198 10.115956 +v -0.167145 -3.145291 10.110515 +v -0.167139 -3.152044 10.105919 +v -0.167118 -3.159341 10.102246 +v -0.167085 -3.167057 10.099558 +v -0.167038 -3.17506 10.097902 +v -0.16698 -3.183213 10.097306 +v -0.166912 -3.191377 10.09778 +v -0.166833 -3.199411 10.099316 +v -0.166746 -3.20718 10.101888 +v -0.166653 -3.214548 10.105451 +v -0.166554 -3.221392 10.109946 +v -0.166451 -3.227593 10.115294 +v -0.166347 -3.233045 10.121405 +v -0.166243 -3.237655 10.128173 +v -0.166141 -3.241344 10.135483 +v -0.166042 -3.244049 10.143211 +v -0.165948 -3.245724 10.151223 +v -0.165861 -3.24634 10.159383 +v -0.165783 -3.245887 10.16755 +v -0.165714 -3.244372 10.175586 +v -0.165656 -3.241821 10.183353 +v -0.16561 -3.238278 10.190718 +v -0.165576 -3.233803 10.197554 +v -0.165556 -3.228473 10.203745 +v 0.198075 -3.189987 10.180229 +v 0.198082 -3.196366 10.175888 +v 0.198056 -3.183093 10.183696 +v 0.198024 -3.175803 10.186231 +v 0.19798 -3.16824 10.187791 +v 0.197926 -3.160534 10.188348 +v 0.19786 -3.152818 10.187893 +v 0.197786 -3.145222 10.186434 +v 0.197704 -3.137878 10.183996 +v 0.197615 -3.13091 10.180621 +v 0.197522 -3.124439 10.176365 +v 0.197425 -3.118574 10.171303 +v 0.197326 -3.113416 10.165521 +v 0.197228 -3.109053 10.159117 +v 0.197131 -3.10556 10.152202 +v 0.197037 -3.102997 10.144893 +v 0.196949 -3.101408 10.137316 +v 0.196867 -3.100819 10.129601 +v 0.196792 -3.101241 10.121877 +v 0.196727 -3.102666 10.11428 +v 0.196672 -3.105071 10.106938 +v 0.196629 -3.108414 10.0999775 +v 0.196597 -3.112637 10.093516 +v 0.196578 -3.11767 10.087667 +v 0.196571 -3.123424 10.082527 +v 0.196578 -3.129803 10.078187 +v 0.196597 -3.136697 10.074719 +v 0.196629 -3.143987 10.072184 +v 0.196672 -3.15155 10.070625 +v 0.196727 -3.159256 10.070068 +v 0.196792 -3.166972 10.070522 +v 0.196867 -3.174568 10.071981 +v 0.196949 -3.181912 10.074419 +v 0.197037 -3.18888 10.077795 +v 0.197131 -3.195351 10.08205 +v 0.197228 -3.201216 10.087112 +v 0.197326 -3.206374 10.0928955 +v 0.197425 -3.210737 10.0992985 +v 0.197522 -3.21423 10.106215 +v 0.197615 -3.216793 10.1135235 +v 0.197704 -3.218382 10.1211 +v 0.197786 -3.218971 10.128816 +v 0.19786 -3.218549 10.136539 +v 0.197926 -3.217124 10.144136 +v 0.19798 -3.214719 10.151478 +v 0.198024 -3.211376 10.158438 +v 0.198056 -3.207153 10.164899 +v 0.198075 -3.20212 10.170749 +v 0.565361 -3.164077 10.146347 +v 0.565367 -3.17009 10.142256 +v 0.565343 -3.157579 10.149616 +v 0.565313 -3.150708 10.152005 +v 0.565272 -3.143579 10.153475 +v 0.56522 -3.136316 10.154 +v 0.565158 -3.129043 10.153572 +v 0.565088 -3.121884 10.152197 +v 0.565011 -3.114962 10.1498995 +v 0.564928 -3.108394 10.146717 +v 0.564839 -3.102294 10.142706 +v 0.564748 -3.096766 10.137935 +v 0.564655 -3.091904 10.132485 +v 0.564562 -3.087792 10.126449 +v 0.564471 -3.0845 10.11993 +v 0.564383 -3.082084 10.113041 +v 0.564299 -3.080586 10.105899 +v 0.564222 -3.080031 10.098627 +v 0.564152 -3.080429 10.091347 +v 0.56409 -3.081772 10.0841875 +v 0.564039 -3.084039 10.077266 +v 0.563998 -3.08719 10.070705 +v 0.563968 -3.091171 10.064616 +v 0.563949 -3.095914 10.059102 +v 0.563943 -3.101338 10.054258 +v 0.563949 -3.107351 10.050167 +v 0.563968 -3.113848 10.046898 +v 0.563998 -3.12072 10.044509 +v 0.564039 -3.127848 10.043039 +v 0.56409 -3.135111 10.042514 +v 0.564152 -3.142385 10.042943 +v 0.564222 -3.149544 10.044318 +v 0.564299 -3.156466 10.046616 +v 0.564383 -3.163034 10.049797 +v 0.564471 -3.169133 10.053808 +v 0.564562 -3.174662 10.058579 +v 0.564655 -3.179523 10.06403 +v 0.564748 -3.183635 10.0700655 +v 0.564839 -3.186928 10.076584 +v 0.564928 -3.189344 10.083473 +v 0.565011 -3.190842 10.090615 +v 0.565088 -3.191397 10.097888 +v 0.565158 -3.190999 10.105167 +v 0.56522 -3.189655 10.112329 +v 0.565272 -3.187389 10.119248 +v 0.565313 -3.184238 10.125809 +v 0.565343 -3.180257 10.131898 +v 0.565361 -3.175514 10.137412 +v 0.936301 -3.13791 10.112129 +v 0.936307 -3.143552 10.10829 +v 0.936284 -3.131812 10.115196 +v 0.936256 -3.125363 10.117439 +v 0.936217 -3.118673 10.118818 +v 0.936169 -3.111858 10.119311 +v 0.936111 -3.105032 10.118909 +v 0.936045 -3.098313 10.117618 +v 0.935973 -3.091817 10.115462 +v 0.935894 -3.085654 10.112476 +v 0.935812 -3.079929 10.108712 +v 0.935726 -3.074741 10.104234 +v 0.935639 -3.070179 10.099119 +v 0.935552 -3.06632 10.093455 +v 0.935466 -3.06323 10.087338 +v 0.935383 -3.060963 10.0808735 +v 0.935305 -3.059557 10.07417 +v 0.935232 -3.059036 10.067345 +v 0.935166 -3.059409 10.060514 +v 0.935109 -3.06067 10.053794 +v 0.93506 -3.062798 10.0473 +v 0.935022 -3.065754 10.041142 +v 0.934994 -3.06949 10.035428 +v 0.934977 -3.073942 10.030253 +v 0.934971 -3.079032 10.025707 +v 0.934977 -3.084674 10.021868 +v 0.934994 -3.090772 10.018801 +v 0.935022 -3.097221 10.016558 +v 0.93506 -3.103911 10.015179 +v 0.935109 -3.110727 10.014686 +v 0.935166 -3.117552 10.015088 +v 0.935232 -3.124271 10.016379 +v 0.935305 -3.130767 10.018535 +v 0.935383 -3.13693 10.021521 +v 0.935466 -3.142655 10.025285 +v 0.935552 -3.147843 10.029763 +v 0.935639 -3.152405 10.034878 +v 0.935726 -3.156264 10.040542 +v 0.935812 -3.159354 10.046659 +v 0.935894 -3.161621 10.053124 +v 0.935973 -3.163027 10.059827 +v 0.936045 -3.163548 10.066652 +v 0.936111 -3.163175 10.073483 +v 0.936169 -3.161914 10.080203 +v 0.936217 -3.159787 10.086697 +v 0.936256 -3.15683 10.0928545 +v 0.936284 -3.153094 10.098569 +v 0.936301 -3.148642 10.1037445 +v 1.30806 -3.111685 10.077835 +v 1.310901 -3.116753 10.073988 +v 1.305208 -3.106185 10.080964 +v 1.302345 -3.10035 10.083324 +v 1.299472 -3.094284 10.08488 +v 1.296589 -3.088093 10.085606 +v 1.293697 -3.081886 10.085495 +v 1.290796 -3.075773 10.08455 +v 1.287889 -3.069861 10.082793 +v 1.284975 -3.064255 10.0802555 +v 1.282057 -3.059055 10.076983 +v 1.279134 -3.054354 10.073038 +v 1.27621 -3.050234 10.068489 +v 1.273285 -3.046772 10.063419 +v 1.270361 -3.04403 10.057917 +v 1.267439 -3.042059 10.052081 +v 1.26452 -3.040897 10.046015 +v 1.261607 -3.040567 10.039827 +v 1.2587 -3.04108 10.0336275 +v 1.255801 -3.042431 10.027524 +v 1.25291 -3.0446 10.021627 +v 1.250029 -3.047555 10.016043 +v 1.247159 -3.05125 10.01087 +v 1.2443 -3.055624 10.006202 +v 1.241452 -3.060607 10.002123 +v 1.2443 -3.065769 9.998275 +v 1.247159 -3.071357 9.99516 +v 1.250029 -3.07727 9.992827 +v 1.25291 -3.083404 9.991311 +v 1.255801 -3.08965 9.990633 +v 1.2587 -3.095898 9.990799 +v 1.261607 -3.102038 9.991801 +v 1.26452 -3.107963 9.993618 +v 1.267439 -3.113567 9.996213 +v 1.270361 -3.118753 9.999538 +v 1.273285 -3.123428 10.003529 +v 1.27621 -3.12751 10.008115 +v 1.279134 -3.130927 10.013212 +v 1.282057 -3.133618 10.018729 +v 1.284975 -3.135534 10.024566 +v 1.287889 -3.13664 10.030619 +v 1.290796 -3.136916 10.03678 +v 1.293697 -3.136353 10.042941 +v 1.296589 -3.13496 10.04899 +v 1.299472 -3.132757 10.054822 +v 1.302345 -3.12978 10.060331 +v 1.305208 -3.126078 10.065421 +v 1.30806 -3.121712 10.070001 +v -0.683053 -2.030011 10.897452 +v -0.994376 -1.98324 10.790324 +v -0.683038 -2.021086 10.899959 +v -0.682994 -2.011906 10.901271 +v -0.987154 -1.975747 10.793977 +v -0.682923 -2.002628 10.901364 +v -0.978626 -1.968264 10.796936 +v -0.682824 -1.993412 10.900238 +v -0.969612 -1.960837 10.79891 +v -0.682699 -1.984414 10.897912 +v -0.960479 -1.953569 10.799784 +v -0.682552 -1.975789 10.894425 +v -0.95145 -1.946583 10.799515 +v -0.682384 -1.967685 10.889837 +v -0.942687 -1.940002 10.798098 +v -0.682198 -1.960239 10.884227 +v -0.934323 -1.933948 10.795561 +v -0.681997 -1.953579 10.877691 +v -0.926466 -1.928537 10.791957 +v -0.919205 -1.923875 10.78736 +v -0.681785 -1.94782 10.87034 +v -0.681566 -1.94306 10.862301 +v -0.912611 -1.920053 10.781869 +v -0.681343 -1.93938 10.85371 +v -0.906732 -1.91715 10.7756 +v -0.68112 -1.936843 10.844715 +v -0.901598 -1.915231 10.768686 +v -0.6809 -1.935493 10.83547 +v -0.897212 -1.914339 10.761278 +v -0.680689 -1.935353 10.826133 +v -0.893556 -1.914504 10.753537 +v -0.680488 -1.936425 10.816864 +v -0.890589 -1.915733 10.745634 +v -0.680302 -1.93869 10.807821 +v -0.888247 -1.918018 10.737747 +v -0.680134 -1.942111 10.799159 +v -0.886445 -1.921331 10.730056 +v -0.679986 -1.946628 10.791026 +v -0.885084 -1.925628 10.722737 +v -0.679862 -1.952165 10.783562 +v -0.884054 -1.930848 10.715961 +v -0.679763 -1.958626 10.776893 +v -0.883247 -1.936914 10.7098875 +v -0.679691 -1.9659 10.771135 +v -0.882564 -1.943735 10.704656 +v -0.679648 -1.973865 10.766386 +v -0.88193 -1.951205 10.700384 +v -0.679633 -1.982382 10.762726 +v -0.881301 -1.959204 10.697161 +v -0.679648 -1.991307 10.760219 +v -0.880675 -1.967599 10.695047 +v -0.679691 -2.000487 10.758908 +v -0.880092 -1.976245 10.694068 +v -0.679763 -2.009765 10.758815 +v -0.87963 -1.984988 10.694221 +v -0.679862 -2.018981 10.759941 +v -0.879394 -1.993667 10.695468 +v -0.679986 -2.027979 10.762267 +v -0.879509 -2.002117 10.697755 +v -0.680134 -2.036604 10.765754 +v -0.880104 -2.010174 10.700998 +v -0.680302 -2.044708 10.770342 +v -0.881302 -2.017681 10.705099 +v -0.680488 -2.052154 10.775951 +v -0.883212 -2.024488 10.709945 +v -0.680689 -2.058814 10.782488 +v -0.885924 -2.030459 10.715412 +v -0.6809 -2.064573 10.789838 +v -0.889503 -2.035472 10.721366 +v -0.68112 -2.069333 10.797878 +v -0.893988 -2.039429 10.727668 +v -0.681343 -2.073013 10.806468 +v -0.899392 -2.042247 10.734175 +v -0.681566 -2.07555 10.815463 +v -0.905699 -2.043872 10.7407465 +v -0.681785 -2.0769 10.824708 +v -0.91287 -2.044268 10.747239 +v -0.681997 -2.07704 10.834045 +v -0.920841 -2.043426 10.753517 +v -0.929524 -2.041363 10.759453 +v -0.682198 -2.075968 10.843315 +v -0.93881 -2.038116 10.764925 +v -0.682384 -2.073703 10.852358 +v -0.682552 -2.070282 10.86102 +v -0.948566 -2.033745 10.76983 +v -0.682699 -2.065765 10.869153 +v -0.958634 -2.028334 10.774078 +v -0.682824 -2.060228 10.876617 +v -0.968814 -2.021989 10.777606 +v -0.682923 -2.053767 10.8832855 +v -0.978821 -2.014839 10.780394 +v -0.988144 -2.007056 10.782517 +v -0.682994 -2.046493 10.889044 +v -0.995546 -1.998912 10.784322 +v -0.683038 -2.038528 10.893793 +v -0.339838 -2.016666 10.887348 +v -0.339828 -2.025555 10.884848 +v -0.339867 -2.007527 10.888665 +v -0.339914 -1.998292 10.888775 +v -0.339978 -1.989121 10.887678 +v -0.340059 -1.98017 10.885391 +v -0.340156 -1.971591 10.881953 +v -0.340266 -1.963533 10.877425 +v -0.340388 -1.956133 10.871882 +v -0.340519 -1.949517 10.86542 +v -0.340657 -1.943799 10.8581505 +v -0.340801 -1.939077 10.850195 +v -0.340947 -1.93543 10.841693 +v -0.341093 -1.932923 10.832788 +v -0.341236 -1.931597 10.823633 +v -0.341375 -1.931475 10.814384 +v -0.341506 -1.93256 10.8052 +v -0.341627 -1.934832 10.796238 +v -0.341737 -1.938254 10.787651 +v -0.341834 -1.942766 10.779586 +v -0.341915 -1.948291 10.7721815 +v -0.34198 -1.954734 10.765563 +v -0.342027 -1.961987 10.759845 +v -0.342055 -1.969923 10.755125 +v -0.342065 -1.978408 10.751484 +v -0.342055 -1.987296 10.748984 +v -0.342027 -1.996436 10.747667 +v -0.34198 -2.00567 10.747556 +v -0.341915 -2.014842 10.748654 +v -0.341834 -2.023793 10.750941 +v -0.341737 -2.032371 10.754379 +v -0.341627 -2.040429 10.758907 +v -0.341506 -2.04783 10.76445 +v -0.341375 -2.054445 10.770912 +v -0.341236 -2.060164 10.778182 +v -0.341093 -2.064886 10.786136 +v -0.340947 -2.068532 10.794639 +v -0.340801 -2.07104 10.803544 +v -0.340657 -2.072366 10.812699 +v -0.340519 -2.072488 10.821948 +v -0.340388 -2.071403 10.831132 +v -0.340266 -2.06913 10.840094 +v -0.340156 -2.065709 10.848681 +v -0.340059 -2.061197 10.856746 +v -0.339978 -2.055672 10.864151 +v -0.339914 -2.049228 10.870769 +v -0.339867 -2.041976 10.876486 +v -0.339838 -2.03404 10.8812065 +v 0.005859 -2.001649 10.843418 +v 0.005868 -2.010072 10.841051 +v 0.005832 -1.992987 10.84466 +v 0.005787 -1.984233 10.844755 +v 0.005725 -1.975538 10.843701 +v 0.005648 -1.96705 10.8415165 +v 0.005556 -1.958915 10.838239 +v 0.005452 -1.951271 10.833924 +v 0.005336 -1.94425 10.828646 +v 0.005211 -1.937971 10.822496 +v 0.00508 -1.932543 10.8155775 +v 0.004943 -1.928057 10.808009 +v 0.004804 -1.924591 10.799922 +v 0.004665 -1.922204 10.791453 +v 0.004529 -1.920937 10.782747 +v 0.004397 -1.920811 10.773954 +v 0.004273 -1.921829 10.765224 +v 0.004157 -1.923973 10.756706 +v 0.004052 -1.927207 10.748546 +v 0.003961 -1.931475 10.740884 +v 0.003883 -1.936704 10.7338505 +v 0.003822 -1.942805 10.727566 +v 0.003777 -1.949673 10.722138 +v 0.00375 -1.957191 10.717659 +v 0.003741 -1.96523 10.714207 +v 0.00375 -1.973653 10.71184 +v 0.003777 -1.982315 10.710598 +v 0.003822 -1.991069 10.710505 +v 0.003883 -1.999764 10.711558 +v 0.003961 -2.008251 10.713742 +v 0.004052 -2.016387 10.717019 +v 0.004157 -2.024031 10.721334 +v 0.004273 -2.031052 10.726612 +v 0.004397 -2.03733 10.732763 +v 0.004529 -2.042759 10.739681 +v 0.004665 -2.047245 10.747249 +v 0.004804 -2.050711 10.755336 +v 0.004943 -2.053098 10.763805 +v 0.00508 -2.054365 10.7725115 +v 0.005211 -2.054491 10.781304 +v 0.005336 -2.053473 10.790034 +v 0.005452 -2.051329 10.7985525 +v 0.005556 -2.048095 10.806712 +v 0.005648 -2.043827 10.814374 +v 0.005725 -2.038598 10.821408 +v 0.005787 -2.032497 10.827692 +v 0.005832 -2.025629 10.83312 +v 0.005859 -2.018111 10.837599 +v 0.354542 -1.986418 10.79897 +v 0.35455 -1.994402 10.796727 +v 0.354516 -1.978207 10.800147 +v 0.354474 -1.969909 10.800237 +v 0.354415 -1.961666 10.799238 +v 0.354342 -1.95362 10.797167 +v 0.354255 -1.945908 10.79406 +v 0.354156 -1.938663 10.78997 +v 0.354046 -1.932007 10.784967 +v 0.353928 -1.926055 10.779136 +v 0.353803 -1.920909 10.772578 +v 0.353674 -1.916657 10.765404 +v 0.353542 -1.913371 10.757737 +v 0.353411 -1.911108 10.749709 +v 0.353281 -1.909907 10.741456 +v 0.353156 -1.909788 10.733121 +v 0.353038 -1.910753 10.724845 +v 0.352928 -1.912785 10.716771 +v 0.352829 -1.91585 10.709035 +v 0.352742 -1.919896 10.701772 +v 0.352669 -1.924853 10.695104 +v 0.352611 -1.930636 10.689147 +v 0.352568 -1.937147 10.684001 +v 0.352543 -1.944273 10.679756 +v 0.352534 -1.951894 10.676483 +v 0.352543 -1.959878 10.674239 +v 0.352568 -1.968089 10.673062 +v 0.352611 -1.976387 10.672973 +v 0.352669 -1.98463 10.673972 +v 0.352742 -1.992676 10.6760435 +v 0.352829 -2.000388 10.67915 +v 0.352928 -2.007633 10.68324 +v 0.353038 -2.014289 10.688243 +v 0.353156 -2.020241 10.694074 +v 0.353281 -2.025387 10.700632 +v 0.353411 -2.029639 10.707806 +v 0.353542 -2.032925 10.715473 +v 0.353674 -2.035188 10.723501 +v 0.353803 -2.036389 10.731753 +v 0.353928 -2.036508 10.740089 +v 0.354046 -2.035543 10.748365 +v 0.354156 -2.033511 10.756439 +v 0.354255 -2.030445 10.764175 +v 0.354342 -2.0264 10.771438 +v 0.354415 -2.021443 10.778106 +v 0.354474 -2.01566 10.784063 +v 0.354516 -2.009149 10.789209 +v 0.354542 -2.002023 10.793454 +v 0.706213 -1.971056 10.754142 +v 0.706222 -1.978598 10.752022 +v 0.706189 -1.963299 10.755253 +v 0.706149 -1.955461 10.755338 +v 0.706094 -1.947675 10.754395 +v 0.706025 -1.940074 10.752439 +v 0.705943 -1.932789 10.749503 +v 0.705849 -1.925945 10.745639 +v 0.705745 -1.919658 10.740913 +v 0.705634 -1.914035 10.735405 +v 0.705516 -1.909174 10.72921 +v 0.705394 -1.905157 10.722433 +v 0.705269 -1.902054 10.715191 +v 0.705145 -1.899916 10.707608 +v 0.705023 -1.898781 10.699812 +v 0.704905 -1.898669 10.691938 +v 0.704793 -1.89958 10.68412 +v 0.704689 -1.9015 10.676493 +v 0.704596 -1.904396 10.669186 +v 0.704514 -1.908217 10.662325 +v 0.704444 -1.9129 10.656026 +v 0.704389 -1.918363 10.650399 +v 0.704349 -1.924513 10.645538 +v 0.704325 -1.931245 10.641528 +v 0.704317 -1.938444 10.638436 +v 0.704325 -1.945986 10.636317 +v 0.704349 -1.953742 10.635205 +v 0.704389 -1.961581 10.63512 +v 0.704444 -1.969367 10.636065 +v 0.704514 -1.976967 10.6380205 +v 0.704596 -1.984252 10.640955 +v 0.704689 -1.991097 10.644819 +v 0.704793 -1.997384 10.649545 +v 0.704905 -2.003006 10.655053 +v 0.705023 -2.007867 10.661248 +v 0.705145 -2.011884 10.668025 +v 0.705269 -2.014988 10.675267 +v 0.705394 -2.017125 10.682851 +v 0.705516 -2.01826 10.690646 +v 0.705634 -2.018373 10.69852 +v 0.705745 -2.017461 10.706338 +v 0.705849 -2.015541 10.713965 +v 0.705943 -2.012646 10.721272 +v 0.706025 -2.008824 10.728134 +v 0.706094 -2.004142 10.734432 +v 0.706149 -1.998679 10.74006 +v 0.706189 -1.992529 10.74492 +v 0.706213 -1.985797 10.74893 +v 1.060874 -1.955564 10.708932 +v 1.060881 -1.96266 10.706937 +v 1.060851 -1.948265 10.709978 +v 1.060813 -1.94089 10.710057 +v 1.060761 -1.933564 10.709169 +v 1.060696 -1.926413 10.707329 +v 1.060619 -1.919559 10.704567 +v 1.060531 -1.913119 10.7009325 +v 1.060433 -1.907203 10.6964855 +v 1.060328 -1.901913 10.691303 +v 1.060217 -1.89734 10.685474 +v 1.060102 -1.89356 10.679098 +v 1.059985 -1.89064 10.672284 +v 1.059868 -1.888629 10.665148 +v 1.059753 -1.887561 10.657814 +v 1.059642 -1.887455 10.650405 +v 1.059537 -1.888313 10.64305 +v 1.05944 -1.890119 10.635873 +v 1.059352 -1.892844 10.628998 +v 1.059274 -1.89644 10.622542 +v 1.059209 -1.900845 10.616616 +v 1.059158 -1.905985 10.611321 +v 1.05912 -1.911772 10.606748 +v 1.059097 -1.918106 10.602975 +v 1.059089 -1.924879 10.600066 +v 1.059097 -1.931975 10.598072 +v 1.05912 -1.939273 10.597026 +v 1.059158 -1.946648 10.596946 +v 1.059209 -1.953974 10.597834 +v 1.059274 -1.961126 10.599674 +v 1.059352 -1.96798 10.602436 +v 1.05944 -1.97442 10.606071 +v 1.059537 -1.980335 10.610518 +v 1.059642 -1.985625 10.6157 +v 1.059753 -1.990199 10.621529 +v 1.059868 -1.993978 10.627905 +v 1.059985 -1.996899 10.634719 +v 1.060102 -1.99891 10.641855 +v 1.060217 -1.999977 10.64919 +v 1.060328 -2.000083 10.656598 +v 1.060433 -1.999226 10.663954 +v 1.060531 -1.997419 10.67113 +v 1.060619 -1.994695 10.678005 +v 1.060696 -1.991099 10.684461 +v 1.060761 -1.986694 10.690387 +v 1.060813 -1.981554 10.695683 +v 1.060851 -1.975767 10.700255 +v 1.060874 -1.969433 10.704029 +v 1.415453 -1.940075 10.663733 +v 1.41853 -1.946587 10.661473 +v 1.412361 -1.933365 10.665104 +v 1.409255 -1.926575 10.665571 +v 1.406135 -1.919824 10.66513 +v 1.403002 -1.913228 10.663792 +v 1.399856 -1.906904 10.661588 +v 1.3967 -1.900963 10.658558 +v 1.393534 -1.895507 10.654761 +v 1.390359 -1.890635 10.650267 +v 1.387178 -1.886431 10.645158 +v 1.383992 -1.882971 10.639528 +v 1.380803 -1.880317 10.633477 +v 1.377613 -1.878518 10.627115 +v 1.374424 -1.877608 10.620558 +v 1.371238 -1.877606 10.613923 +v 1.368057 -1.878514 10.607331 +v 1.364883 -1.88032 10.600899 +v 1.361717 -1.882998 10.594745 +v 1.358562 -1.886503 10.58898 +v 1.355418 -1.89078 10.583711 +v 1.352288 -1.895758 10.579033 +v 1.349172 -1.901355 10.575034 +v 1.34607 -1.907478 10.571789 +v 1.342985 -1.914024 10.569361 +v 1.34607 -1.920642 10.567135 +v 1.349172 -1.927444 10.565811 +v 1.352288 -1.934311 10.565404 +v 1.355418 -1.941122 10.565914 +v 1.358562 -1.947761 10.567325 +v 1.361717 -1.95411 10.569605 +v 1.364883 -1.960061 10.572709 +v 1.368057 -1.965508 10.576576 +v 1.371238 -1.970358 10.581134 +v 1.374424 -1.974526 10.586296 +v 1.377613 -1.977939 10.591969 +v 1.380803 -1.980538 10.598047 +v 1.383992 -1.982277 10.604421 +v 1.387178 -1.983125 10.610975 +v 1.390359 -1.983066 10.617591 +v 1.393534 -1.9821 10.624149 +v 1.3967 -1.980243 10.630531 +v 1.399856 -1.977526 10.636622 +v 1.403002 -1.973992 10.642311 +v 1.406135 -1.969703 10.647497 +v 1.409255 -1.964729 10.652083 +v 1.412361 -1.959154 10.655987 +v 1.415453 -1.953073 10.659137 +v -0.736629 -0.673242 11.192366 +v -0.736647 -0.682556 11.192253 +v -1.070065 -0.662671 11.055792 +v -0.736573 -0.663992 11.191249 +v -1.061453 -0.653818 11.058103 +v -0.736481 -0.654964 11.188922 +v -1.051635 -0.645209 11.059645 +v -0.736355 -0.646311 11.185424 +v -1.041433 -0.636972 11.060128 +v -0.736196 -0.638182 11.180815 +v -1.031187 -0.629242 11.059478 +v -0.736008 -0.630716 11.175175 +v -1.021108 -0.622153 11.057695 +v -1.011358 -0.615827 11.054814 +v -0.735793 -0.62404 11.168599 +v -1.002073 -0.610375 11.0509 +v -0.735556 -0.61827 11.161201 +v -0.7353 -0.613503 11.153105 +v -0.993366 -0.605893 11.046036 +v -0.73503 -0.609822 11.144452 +v -0.985334 -0.602461 11.040327 +v -0.73475 -0.607289 11.13539 +v -0.978054 -0.600139 11.0338955 +v -0.734465 -0.605947 11.126073 +v -0.97158 -0.598972 11.0268755 +v -0.73418 -0.60582 11.11666 +v -0.965947 -0.598981 11.019419 +v -0.7339 -0.60691 11.107314 +v -0.961165 -0.600169 11.011685 +v -0.73363 -0.609198 11.098193 +v -0.95722 -0.602519 11.003845 +v -0.733374 -0.612644 11.089454 +v -0.954074 -0.605994 10.996074 +v -0.733137 -0.617191 11.081246 +v -0.951663 -0.610536 10.988552 +v -0.732922 -0.622759 11.07371 +v -0.9499 -0.616073 10.98146 +v -0.732734 -0.629255 11.066975 +v -0.948679 -0.622514 10.974978 +v -0.732575 -0.636566 11.061156 +v -0.947879 -0.629751 10.969275 +v -0.732449 -0.644568 11.056352 +v -0.947374 -0.637665 10.964508 +v -0.732357 -0.653124 11.052646 +v -0.947048 -0.646125 10.960814 +v -0.732302 -0.662087 11.050101 +v -0.946803 -0.654991 10.958299 +v -0.732283 -0.671304 11.04876 +v -0.946578 -0.664111 10.957035 +v -0.732302 -0.680617 11.048648 +v -0.946356 -0.673333 10.957053 +v -0.732357 -0.689867 11.049765 +v -0.946169 -0.682497 10.95834 +v -0.732449 -0.698896 11.052092 +v -0.946093 -0.691444 10.960842 +v -0.732575 -0.707549 11.05559 +v -0.946234 -0.700018 10.964471 +v -0.732734 -0.715678 11.060198 +v -0.94672 -0.708067 10.969108 +v -0.732922 -0.723144 11.065839 +v -0.947683 -0.715449 10.974616 +v -0.733137 -0.729819 11.072415 +v -0.949246 -0.722031 10.98084 +v -0.733374 -0.735589 11.079813 +v -0.951519 -0.727696 10.9876175 +v -0.73363 -0.740356 11.087908 +v -0.954589 -0.732343 10.9947815 +v -0.7339 -0.744038 11.096561 +v -0.958519 -0.735887 11.002163 +v -0.73418 -0.746571 11.105624 +v -0.963346 -0.738264 11.009594 +v -0.734465 -0.747912 11.114941 +v -0.969082 -0.739431 11.016912 +v -0.73475 -0.748039 11.124353 +v -0.975713 -0.739366 11.023959 +v -0.73503 -0.74695 11.1337 +v -0.983201 -0.738068 11.030586 +v -0.7353 -0.744662 11.14282 +v -0.991485 -0.735557 11.0366535 +v -0.735556 -0.741215 11.15156 +v -1.000485 -0.731878 11.042033 +v -0.735793 -0.736669 11.159767 +v -1.010097 -0.727091 11.046613 +v -0.736008 -0.7311 11.167303 +v -1.020201 -0.721278 11.050298 +v -1.030652 -0.714541 11.053011 +v -0.736196 -0.724605 11.174038 +v -0.736355 -0.717293 11.179858 +v -1.041278 -0.706994 11.054701 +v -1.05185 -0.698769 11.055356 +v -0.736481 -0.709291 11.184662 +v -0.736573 -0.700736 11.188368 +v -1.061986 -0.690015 11.055045 +v -0.736629 -0.691773 11.190913 +v -1.070702 -0.680907 11.054099 +v -0.376692 -0.672118 11.177912 +v -0.376682 -0.681422 11.177794 +v -0.376724 -0.662877 11.176812 +v -0.376776 -0.653859 11.174512 +v -0.376847 -0.645217 11.171053 +v -0.376936 -0.637099 11.166493 +v -0.377043 -0.629644 11.16091 +v -0.377164 -0.62298 11.1544 +v -0.377298 -0.61722 11.147074 +v -0.377442 -0.612463 11.139058 +v -0.377595 -0.608791 11.130489 +v -0.377753 -0.606267 11.121512 +v -0.377913 -0.604932 11.112283 +v -0.378074 -0.604812 11.102959 +v -0.378232 -0.605906 11.093699 +v -0.378385 -0.608198 11.084662 +v -0.378529 -0.611647 11.076002 +v -0.378663 -0.616194 11.067868 +v -0.378784 -0.621763 11.060399 +v -0.37889 -0.628256 11.053723 +v -0.37898 -0.635564 11.047953 +v -0.379051 -0.643562 11.043189 +v -0.379103 -0.652111 11.039512 +v -0.379134 -0.661067 11.036985 +v -0.379145 -0.670276 11.035651 +v -0.379134 -0.67958 11.035533 +v -0.379103 -0.68882 11.0366335 +v -0.379051 -0.697839 11.038933 +v -0.37898 -0.706481 11.042392 +v -0.37889 -0.714599 11.046952 +v -0.378784 -0.722054 11.052535 +v -0.378663 -0.728718 11.059045 +v -0.378529 -0.734478 11.066371 +v -0.378385 -0.739234 11.074387 +v -0.378232 -0.742907 11.082956 +v -0.378074 -0.745431 11.091933 +v -0.377913 -0.746765 11.101162 +v -0.377753 -0.746886 11.110486 +v -0.377595 -0.745791 11.119746 +v -0.377442 -0.7435 11.128783 +v -0.377298 -0.740051 11.137444 +v -0.377164 -0.735503 11.145577 +v -0.377043 -0.729935 11.153046 +v -0.376936 -0.723441 11.159722 +v -0.376847 -0.716134 11.165492 +v -0.376776 -0.708136 11.170256 +v -0.376724 -0.699587 11.173933 +v -0.376692 -0.690631 11.17646 +v -0.014231 -0.668567 11.126168 +v -0.014221 -0.677365 11.12606 +v -0.014261 -0.65983 11.12512 +v -0.01431 -0.651302 11.122933 +v -0.014378 -0.643129 11.119645 +v -0.014463 -0.635451 11.115312 +v -0.014564 -0.6284 11.110008 +v -0.014679 -0.622096 11.103824 +v -0.014806 -0.616648 11.096865 +v -0.014943 -0.612148 11.0892515 +v -0.015088 -0.608673 11.081112 +v -0.015238 -0.606282 11.072587 +v -0.015391 -0.605018 11.063823 +v -0.015543 -0.604901 11.054968 +v -0.015693 -0.605933 11.046175 +v -0.015838 -0.608097 11.037594 +v -0.015975 -0.611355 11.029371 +v -0.016103 -0.615653 11.021648 +v -0.016218 -0.620915 11.014557 +v -0.016319 -0.627054 11.008219 +v -0.016404 -0.633962 11.002742 +v -0.016471 -0.641522 10.998221 +v -0.01652 -0.649606 10.994731 +v -0.01655 -0.658073 10.992334 +v -0.01656 -0.66678 10.991071 +v -0.01655 -0.675578 10.990962 +v -0.01652 -0.684316 10.99201 +v -0.016471 -0.692844 10.994196 +v -0.016404 -0.701017 10.997484 +v -0.016319 -0.708694 11.001817 +v -0.016218 -0.715745 11.007121 +v -0.016103 -0.722049 11.013305 +v -0.015975 -0.727498 11.020264 +v -0.015838 -0.731998 11.027878 +v -0.015693 -0.735473 11.036017 +v -0.015543 -0.737863 11.044542 +v -0.015391 -0.739127 11.053308 +v -0.015238 -0.739245 11.062161 +v -0.015088 -0.738212 11.070955 +v -0.014943 -0.736049 11.079536 +v -0.014806 -0.73279 11.087758 +v -0.014679 -0.728493 11.095481 +v -0.014564 -0.72323 11.102572 +v -0.014463 -0.717092 11.10891 +v -0.014378 -0.710183 11.1143875 +v -0.01431 -0.702623 11.118909 +v -0.014261 -0.69454 11.122398 +v -0.014231 -0.686072 11.124795 +v 0.35136 -0.664932 11.0737705 +v 0.35137 -0.673257 11.073668 +v 0.351332 -0.656664 11.072778 +v 0.351285 -0.648594 11.070709 +v 0.351221 -0.64086 11.067598 +v 0.351141 -0.633595 11.0634985 +v 0.351046 -0.626923 11.058478 +v 0.350937 -0.620958 11.052626 +v 0.350816 -0.615802 11.0460415 +v 0.350686 -0.611544 11.0388365 +v 0.350549 -0.608256 11.031134 +v 0.350407 -0.605994 11.023068 +v 0.350263 -0.604797 11.014774 +v 0.350119 -0.604687 11.006394 +v 0.349977 -0.605663 10.998075 +v 0.349839 -0.607711 10.989953 +v 0.34971 -0.610794 10.982173 +v 0.349589 -0.614861 10.974864 +v 0.34948 -0.619841 10.968154 +v 0.349385 -0.625649 10.962156 +v 0.349305 -0.632186 10.956974 +v 0.349241 -0.63934 10.952695 +v 0.349194 -0.646989 10.949393 +v 0.349166 -0.655001 10.947125 +v 0.349156 -0.66324 10.94593 +v 0.349166 -0.671565 10.945827 +v 0.349194 -0.679834 10.946818 +v 0.349241 -0.687903 10.948887 +v 0.349305 -0.695637 10.951998 +v 0.349385 -0.702902 10.9560995 +v 0.34948 -0.709574 10.961118 +v 0.349589 -0.715539 10.96697 +v 0.34971 -0.720695 10.973555 +v 0.349839 -0.724954 10.98076 +v 0.349977 -0.728242 10.988462 +v 0.350119 -0.730503 10.996529 +v 0.350263 -0.7317 11.004823 +v 0.350407 -0.731811 11.013202 +v 0.350549 -0.730834 11.021523 +v 0.350686 -0.728787 11.029643 +v 0.350816 -0.725703 11.037424 +v 0.350937 -0.721637 11.044732 +v 0.351046 -0.716657 11.051442 +v 0.351141 -0.710849 11.05744 +v 0.351221 -0.704312 11.062622 +v 0.351285 -0.697157 11.066901 +v 0.351332 -0.689509 11.070203 +v 0.35136 -0.681496 11.072471 +v 0.720085 -0.661265 11.020923 +v 0.720094 -0.669113 11.020826 +v 0.720059 -0.65347 11.019989 +v 0.720015 -0.645862 11.018038 +v 0.719954 -0.638571 11.015105 +v 0.719879 -0.631722 11.011239 +v 0.719789 -0.625432 11.006507 +v 0.719686 -0.619809 11.00099 +v 0.719572 -0.614948 10.994782 +v 0.71945 -0.610933 10.987989 +v 0.719321 -0.607833 10.980729 +v 0.719187 -0.605701 10.973123 +v 0.719051 -0.604573 10.965304 +v 0.718915 -0.604468 10.957405 +v 0.718781 -0.605389 10.94956 +v 0.718652 -0.607319 10.941905 +v 0.718529 -0.610226 10.934569 +v 0.718416 -0.61406 10.92768 +v 0.718313 -0.618755 10.921353 +v 0.718223 -0.624231 10.915699 +v 0.718147 -0.630393 10.910813 +v 0.718087 -0.637138 10.906779 +v 0.718043 -0.644349 10.9036665 +v 0.718016 -0.651903 10.901528 +v 0.718007 -0.65967 10.900401 +v 0.718016 -0.667519 10.900304 +v 0.718043 -0.675314 10.901238 +v 0.718087 -0.682922 10.903189 +v 0.718147 -0.690213 10.906122 +v 0.718223 -0.697062 10.909988 +v 0.718313 -0.703352 10.914721 +v 0.718416 -0.708975 10.920238 +v 0.718529 -0.713836 10.926445 +v 0.718652 -0.717851 10.933237 +v 0.718781 -0.720951 10.940498 +v 0.718915 -0.723083 10.948104 +v 0.719051 -0.724211 10.955923 +v 0.719187 -0.724316 10.963822 +v 0.719321 -0.723395 10.971667 +v 0.71945 -0.721464 10.979322 +v 0.719572 -0.718558 10.986658 +v 0.719686 -0.714724 10.993547 +v 0.719789 -0.710029 10.999874 +v 0.719879 -0.704553 11.005528 +v 0.719954 -0.69839 11.010414 +v 0.720015 -0.691646 11.014448 +v 0.720059 -0.684435 11.01756 +v 0.720085 -0.676881 11.019699 +v 1.091944 -0.657567 10.9676285 +v 1.091952 -0.664935 10.967536 +v 1.091919 -0.65025 10.96675 +v 1.091878 -0.643107 10.964919 +v 1.091821 -0.636263 10.962165 +v 1.09175 -0.629833 10.958536 +v 1.091665 -0.623928 10.954094 +v 1.091569 -0.618649 10.9489155 +v 1.091462 -0.614086 10.943087 +v 1.091348 -0.610317 10.93671 +v 1.091226 -0.607407 10.929894 +v 1.091101 -0.605405 10.922755 +v 1.090973 -0.604346 10.915414 +v 1.090845 -0.604248 10.907999 +v 1.090719 -0.605113 10.900634 +v 1.090598 -0.606925 10.893448 +v 1.090483 -0.609654 10.886562 +v 1.090377 -0.613253 10.880095 +v 1.09028 -0.61766 10.874155 +v 1.090196 -0.6228 10.868847 +v 1.090125 -0.628586 10.86426 +v 1.090068 -0.634917 10.860473 +v 1.090027 -0.641687 10.857551 +v 1.090002 -0.648778 10.855544 +v 1.089993 -0.65607 10.8544855 +v 1.090002 -0.663438 10.854394 +v 1.090027 -0.670755 10.855272 +v 1.090068 -0.677897 10.857103 +v 1.090125 -0.684742 10.859857 +v 1.090196 -0.691172 10.863486 +v 1.09028 -0.697076 10.8679285 +v 1.090377 -0.702356 10.873107 +v 1.090483 -0.706919 10.878935 +v 1.090598 -0.710688 10.885311 +v 1.090719 -0.713598 10.892128 +v 1.090845 -0.715599 10.899267 +v 1.090973 -0.716658 10.906608 +v 1.091101 -0.716756 10.914023 +v 1.091226 -0.715892 10.921387 +v 1.091348 -0.71408 10.928574 +v 1.091462 -0.711351 10.93546 +v 1.091569 -0.707752 10.941928 +v 1.091665 -0.703345 10.947867 +v 1.09175 -0.698204 10.953176 +v 1.091821 -0.692419 10.957762 +v 1.091878 -0.686087 10.961549 +v 1.091919 -0.679318 10.964471 +v 1.091944 -0.672227 10.966478 +v 1.463876 -0.653868 10.914321 +v 1.466944 -0.660721 10.913797 +v 1.460793 -0.647055 10.913939 +v 1.457694 -0.640397 10.912663 +v 1.45458 -0.634011 10.910522 +v 1.451452 -0.628006 10.907558 +v 1.44831 -0.622486 10.903828 +v 1.445156 -0.617547 10.899402 +v 1.441992 -0.613274 10.8943615 +v 1.438819 -0.609742 10.8888 +v 1.435638 -0.607013 10.882818 +v 1.432452 -0.605134 10.876525 +v 1.429263 -0.604141 10.870036 +v 1.426073 -0.60405 10.863468 +v 1.422884 -0.604866 10.856941 +v 1.419699 -0.606576 10.850574 +v 1.416518 -0.609152 10.844481 +v 1.413346 -0.612552 10.838776 +v 1.410182 -0.616718 10.833563 +v 1.40703 -0.621582 10.82894 +v 1.403891 -0.627061 10.824992 +v 1.400766 -0.633063 10.821796 +v 1.397656 -0.639485 10.819414 +v 1.394562 -0.64622 10.817894 +v 1.391486 -0.653152 10.817271 +v 1.394562 -0.660096 10.816806 +v 1.397656 -0.666986 10.817258 +v 1.400766 -0.673701 10.81861 +v 1.403891 -0.680127 10.820831 +v 1.40703 -0.686155 10.823876 +v 1.410182 -0.69168 10.827685 +v 1.413346 -0.696608 10.832184 +v 1.416518 -0.700855 10.83729 +v 1.419699 -0.70435 10.842906 +v 1.422884 -0.707031 10.848929 +v 1.426073 -0.708854 10.85525 +v 1.429263 -0.709789 10.8617525 +v 1.432452 -0.709819 10.868316 +v 1.435638 -0.708944 10.8748255 +v 1.438819 -0.70718 10.881159 +v 1.441992 -0.704559 10.887203 +v 1.445156 -0.701123 10.892848 +v 1.44831 -0.696934 10.89799 +v 1.451452 -0.692063 10.902535 +v 1.45458 -0.686594 10.906399 +v 1.457694 -0.680619 10.909509 +v 1.460793 -0.674242 10.911807 +v 1.463876 -0.667571 10.913247 +v -0.736629 0.691773 11.190913 +v -0.736647 0.682556 11.192253 +v -1.070702 0.680907 11.054099 +v -0.736573 0.700736 11.188368 +v -1.061986 0.690015 11.055045 +v -0.736481 0.709291 11.184662 +v -1.05185 0.698769 11.055356 +v -0.736355 0.717293 11.179858 +v -1.041278 0.706994 11.054701 +v -0.736196 0.724605 11.174038 +v -1.030652 0.714541 11.053011 +v -0.736008 0.7311 11.167303 +v -1.020201 0.721278 11.050298 +v -0.735793 0.736669 11.159767 +v -1.010097 0.727091 11.046613 +v -0.735556 0.741215 11.15156 +v -1.000485 0.731878 11.042033 +v -0.7353 0.744662 11.14282 +v -0.991485 0.735557 11.0366535 +v -0.73503 0.74695 11.1337 +v -0.983201 0.738068 11.030586 +v -0.975713 0.739366 11.023959 +v -0.73475 0.748039 11.124353 +v -0.734465 0.747912 11.114941 +v -0.969082 0.739431 11.016912 +v -0.73418 0.746571 11.105624 +v -0.963346 0.738264 11.009594 +v -0.7339 0.744038 11.096561 +v -0.958519 0.735887 11.002163 +v -0.73363 0.740356 11.087908 +v -0.954589 0.732343 10.9947815 +v -0.733374 0.735589 11.079813 +v -0.951519 0.727696 10.9876175 +v -0.733137 0.729819 11.072415 +v -0.949246 0.722031 10.98084 +v -0.732922 0.723144 11.065839 +v -0.947683 0.715449 10.974616 +v -0.732734 0.715678 11.060198 +v -0.94672 0.708067 10.969108 +v -0.732575 0.707549 11.05559 +v -0.946234 0.700018 10.964471 +v -0.732449 0.698896 11.052092 +v -0.946093 0.691444 10.960842 +v -0.732357 0.689867 11.049765 +v -0.946169 0.682497 10.95834 +v -0.732302 0.680617 11.048648 +v -0.946356 0.673333 10.957053 +v -0.732283 0.671304 11.04876 +v -0.946578 0.664111 10.957035 +v -0.732302 0.662087 11.050101 +v -0.946803 0.654991 10.958299 +v -0.732357 0.653124 11.052646 +v -0.947048 0.646125 10.960814 +v -0.732449 0.644568 11.056352 +v -0.947374 0.637665 10.964508 +v -0.732575 0.636566 11.061156 +v -0.947879 0.629751 10.969275 +v -0.732734 0.629255 11.066975 +v -0.948679 0.622514 10.974978 +v -0.732922 0.622759 11.07371 +v -0.9499 0.616073 10.98146 +v -0.733137 0.617191 11.081246 +v -0.951663 0.610536 10.988552 +v -0.733374 0.612644 11.089454 +v -0.954074 0.605994 10.996074 +v -0.73363 0.609198 11.098193 +v -0.95722 0.602519 11.003845 +v -0.7339 0.60691 11.107314 +v -0.961165 0.600169 11.011685 +v -0.73418 0.60582 11.11666 +v -0.965947 0.598981 11.019419 +v -0.734465 0.605947 11.126073 +v -0.97158 0.598972 11.0268755 +v -0.73475 0.607289 11.13539 +v -0.978054 0.600139 11.0338955 +v -0.73503 0.609822 11.144452 +v -0.985334 0.602461 11.040327 +v -0.7353 0.613503 11.153105 +v -0.993366 0.605893 11.046036 +v -0.735556 0.61827 11.161201 +v -1.002073 0.610375 11.0509 +v -0.735793 0.62404 11.168599 +v -1.011358 0.615827 11.054814 +v -0.736008 0.630716 11.175175 +v -1.021108 0.622153 11.057695 +v -0.736196 0.638182 11.180815 +v -1.031187 0.629242 11.059478 +v -0.736355 0.646311 11.185424 +v -1.041433 0.636972 11.060128 +v -0.736481 0.654964 11.188922 +v -1.051635 0.645209 11.059645 +v -0.736573 0.663992 11.191249 +v -1.061453 0.653818 11.058103 +v -0.736629 0.673242 11.192366 +v -1.070065 0.662671 11.055792 +v -0.376692 0.690631 11.17646 +v -0.376682 0.681422 11.177794 +v -0.376724 0.699587 11.173933 +v -0.376776 0.708136 11.170256 +v -0.376847 0.716134 11.165492 +v -0.376936 0.723441 11.159722 +v -0.377043 0.729935 11.153046 +v -0.377164 0.735503 11.145577 +v -0.377298 0.740051 11.137444 +v -0.377442 0.7435 11.128783 +v -0.377595 0.745791 11.119746 +v -0.377753 0.746886 11.110486 +v -0.377913 0.746765 11.101162 +v -0.378074 0.745431 11.091933 +v -0.378232 0.742907 11.082956 +v -0.378385 0.739234 11.074387 +v -0.378529 0.734478 11.066371 +v -0.378663 0.728718 11.059045 +v -0.378784 0.722054 11.052535 +v -0.37889 0.714599 11.046952 +v -0.37898 0.706481 11.042392 +v -0.379051 0.697839 11.038933 +v -0.379103 0.68882 11.0366335 +v -0.379134 0.67958 11.035533 +v -0.379145 0.670276 11.035651 +v -0.379134 0.661067 11.036985 +v -0.379103 0.652111 11.039512 +v -0.379051 0.643562 11.043189 +v -0.37898 0.635564 11.047953 +v -0.37889 0.628256 11.053723 +v -0.378784 0.621763 11.060399 +v -0.378663 0.616194 11.067868 +v -0.378529 0.611647 11.076002 +v -0.378385 0.608198 11.084662 +v -0.378232 0.605906 11.093699 +v -0.378074 0.604812 11.102959 +v -0.377913 0.604932 11.112283 +v -0.377753 0.606267 11.121512 +v -0.377595 0.608791 11.130489 +v -0.377442 0.612463 11.139058 +v -0.377298 0.61722 11.147074 +v -0.377164 0.62298 11.1544 +v -0.377043 0.629644 11.16091 +v -0.376936 0.637099 11.166493 +v -0.376847 0.645217 11.171053 +v -0.376776 0.653859 11.174512 +v -0.376724 0.662877 11.176812 +v -0.376692 0.672118 11.177912 +v -0.014231 0.686072 11.124795 +v -0.014221 0.677365 11.12606 +v -0.014261 0.69454 11.122398 +v -0.01431 0.702623 11.118909 +v -0.014378 0.710183 11.1143875 +v -0.014463 0.717092 11.10891 +v -0.014564 0.72323 11.102572 +v -0.014679 0.728493 11.095481 +v -0.014806 0.73279 11.087758 +v -0.014943 0.736049 11.079536 +v -0.015088 0.738212 11.070955 +v -0.015238 0.739245 11.062161 +v -0.015391 0.739127 11.053308 +v -0.015543 0.737863 11.044542 +v -0.015693 0.735473 11.036017 +v -0.015838 0.731998 11.027878 +v -0.015975 0.727498 11.020264 +v -0.016103 0.722049 11.013305 +v -0.016218 0.715745 11.007121 +v -0.016319 0.708694 11.001817 +v -0.016404 0.701017 10.997484 +v -0.016471 0.692844 10.994196 +v -0.01652 0.684316 10.99201 +v -0.01655 0.675578 10.990962 +v -0.01656 0.66678 10.991071 +v -0.01655 0.658073 10.992334 +v -0.01652 0.649606 10.994731 +v -0.016471 0.641522 10.998221 +v -0.016404 0.633962 11.002742 +v -0.016319 0.627054 11.008219 +v -0.016218 0.620915 11.014557 +v -0.016103 0.615653 11.021648 +v -0.015975 0.611355 11.029371 +v -0.015838 0.608097 11.037594 +v -0.015693 0.605933 11.046175 +v -0.015543 0.604901 11.054968 +v -0.015391 0.605018 11.063823 +v -0.015238 0.606282 11.072587 +v -0.015088 0.608673 11.081112 +v -0.014943 0.612148 11.0892515 +v -0.014806 0.616648 11.096865 +v -0.014679 0.622096 11.103824 +v -0.014564 0.6284 11.110008 +v -0.014463 0.635451 11.115312 +v -0.014378 0.643129 11.119645 +v -0.01431 0.651302 11.122933 +v -0.014261 0.65983 11.12512 +v -0.014231 0.668567 11.126168 +v 0.35136 0.681496 11.072471 +v 0.35137 0.673257 11.073668 +v 0.351332 0.689509 11.070203 +v 0.351285 0.697157 11.066901 +v 0.351221 0.704312 11.062622 +v 0.351141 0.710849 11.05744 +v 0.351046 0.716657 11.051442 +v 0.350937 0.721637 11.044732 +v 0.350816 0.725703 11.037424 +v 0.350686 0.728787 11.029643 +v 0.350549 0.730834 11.021523 +v 0.350407 0.731811 11.013202 +v 0.350263 0.7317 11.004823 +v 0.350119 0.730503 10.996529 +v 0.349977 0.728242 10.988462 +v 0.349839 0.724954 10.98076 +v 0.34971 0.720695 10.973555 +v 0.349589 0.715539 10.96697 +v 0.34948 0.709574 10.961118 +v 0.349385 0.702902 10.9560995 +v 0.349305 0.695637 10.951998 +v 0.349241 0.687903 10.948887 +v 0.349194 0.679834 10.946818 +v 0.349166 0.671565 10.945827 +v 0.349156 0.66324 10.94593 +v 0.349166 0.655001 10.947125 +v 0.349194 0.646989 10.949393 +v 0.349241 0.63934 10.952695 +v 0.349305 0.632186 10.956974 +v 0.349385 0.625649 10.962156 +v 0.34948 0.619841 10.968154 +v 0.349589 0.614861 10.974864 +v 0.34971 0.610794 10.982173 +v 0.349839 0.607711 10.989953 +v 0.349977 0.605663 10.998075 +v 0.350119 0.604687 11.006394 +v 0.350263 0.604797 11.014774 +v 0.350407 0.605994 11.023068 +v 0.350549 0.608256 11.031134 +v 0.350686 0.611544 11.0388365 +v 0.350816 0.615802 11.0460415 +v 0.350937 0.620958 11.052626 +v 0.351046 0.626923 11.058478 +v 0.351141 0.633595 11.0634985 +v 0.351221 0.64086 11.067598 +v 0.351285 0.648594 11.070709 +v 0.351332 0.656664 11.072778 +v 0.35136 0.664932 11.0737705 +v 0.720085 0.676881 11.019699 +v 0.720094 0.669113 11.020826 +v 0.720059 0.684435 11.01756 +v 0.720015 0.691646 11.014448 +v 0.719954 0.69839 11.010414 +v 0.719879 0.704553 11.005528 +v 0.719789 0.710029 10.999874 +v 0.719686 0.714724 10.993547 +v 0.719572 0.718558 10.986658 +v 0.71945 0.721464 10.979322 +v 0.719321 0.723395 10.971667 +v 0.719187 0.724316 10.963822 +v 0.719051 0.724211 10.955923 +v 0.718915 0.723083 10.948104 +v 0.718781 0.720951 10.940498 +v 0.718652 0.717851 10.933237 +v 0.718529 0.713836 10.926445 +v 0.718416 0.708975 10.920238 +v 0.718313 0.703352 10.914721 +v 0.718223 0.697062 10.909988 +v 0.718147 0.690213 10.906122 +v 0.718087 0.682922 10.903189 +v 0.718043 0.675314 10.901238 +v 0.718016 0.667519 10.900304 +v 0.718007 0.65967 10.900401 +v 0.718016 0.651903 10.901528 +v 0.718043 0.644349 10.9036665 +v 0.718087 0.637138 10.906779 +v 0.718147 0.630393 10.910813 +v 0.718223 0.624231 10.915699 +v 0.718313 0.618755 10.921353 +v 0.718416 0.61406 10.92768 +v 0.718529 0.610226 10.934569 +v 0.718652 0.607319 10.941905 +v 0.718781 0.605389 10.94956 +v 0.718915 0.604468 10.957405 +v 0.719051 0.604573 10.965304 +v 0.719187 0.605701 10.973123 +v 0.719321 0.607833 10.980729 +v 0.71945 0.610933 10.987989 +v 0.719572 0.614948 10.994782 +v 0.719686 0.619809 11.00099 +v 0.719789 0.625432 11.006507 +v 0.719879 0.631722 11.011239 +v 0.719954 0.638571 11.015105 +v 0.720015 0.645862 11.018038 +v 0.720059 0.65347 11.019989 +v 0.720085 0.661265 11.020923 +v 1.091944 0.672227 10.966478 +v 1.091952 0.664935 10.967536 +v 1.091919 0.679318 10.964471 +v 1.091878 0.686087 10.961549 +v 1.091821 0.692419 10.957762 +v 1.09175 0.698204 10.953176 +v 1.091665 0.703345 10.947867 +v 1.091569 0.707752 10.941928 +v 1.091462 0.711351 10.93546 +v 1.091348 0.71408 10.928574 +v 1.091226 0.715892 10.921387 +v 1.091101 0.716756 10.914023 +v 1.090973 0.716658 10.906608 +v 1.090845 0.715599 10.899267 +v 1.090719 0.713598 10.892128 +v 1.090598 0.710688 10.885311 +v 1.090483 0.706919 10.878935 +v 1.090377 0.702356 10.873107 +v 1.09028 0.697076 10.8679285 +v 1.090196 0.691172 10.863486 +v 1.090125 0.684742 10.859857 +v 1.090068 0.677897 10.857103 +v 1.090027 0.670755 10.855272 +v 1.090002 0.663438 10.854394 +v 1.089993 0.65607 10.8544855 +v 1.090002 0.648778 10.855544 +v 1.090027 0.641687 10.857551 +v 1.090068 0.634917 10.860473 +v 1.090125 0.628586 10.86426 +v 1.090196 0.6228 10.868847 +v 1.09028 0.61766 10.874155 +v 1.090377 0.613253 10.880095 +v 1.090483 0.609654 10.886562 +v 1.090598 0.606925 10.893448 +v 1.090719 0.605113 10.900634 +v 1.090845 0.604248 10.907999 +v 1.090973 0.604346 10.915414 +v 1.091101 0.605405 10.922755 +v 1.091226 0.607407 10.929894 +v 1.091348 0.610317 10.93671 +v 1.091462 0.614086 10.943087 +v 1.091569 0.618649 10.9489155 +v 1.091665 0.623928 10.954094 +v 1.09175 0.629833 10.958536 +v 1.091821 0.636263 10.962165 +v 1.091878 0.643107 10.964919 +v 1.091919 0.65025 10.96675 +v 1.091944 0.657567 10.9676285 +v 1.463876 0.667571 10.913247 +v 1.466944 0.660721 10.913797 +v 1.460793 0.674242 10.911807 +v 1.457694 0.680619 10.909509 +v 1.45458 0.686594 10.906399 +v 1.451452 0.692063 10.902535 +v 1.44831 0.696934 10.89799 +v 1.445156 0.701123 10.892848 +v 1.441992 0.704559 10.887203 +v 1.438819 0.70718 10.881159 +v 1.435638 0.708944 10.8748255 +v 1.432452 0.709819 10.868316 +v 1.429263 0.709789 10.8617525 +v 1.426073 0.708854 10.85525 +v 1.422884 0.707031 10.848929 +v 1.419699 0.70435 10.842906 +v 1.416518 0.700855 10.83729 +v 1.413346 0.696608 10.832184 +v 1.410182 0.69168 10.827685 +v 1.40703 0.686155 10.823876 +v 1.403891 0.680127 10.820831 +v 1.400766 0.673701 10.81861 +v 1.397656 0.666986 10.817258 +v 1.394562 0.660096 10.816806 +v 1.391486 0.653152 10.817271 +v 1.394562 0.64622 10.817894 +v 1.397656 0.639485 10.819414 +v 1.400766 0.633063 10.821796 +v 1.403891 0.627061 10.824992 +v 1.40703 0.621582 10.82894 +v 1.410182 0.616718 10.833563 +v 1.413346 0.612552 10.838776 +v 1.416518 0.609152 10.844481 +v 1.419699 0.606576 10.850574 +v 1.422884 0.604866 10.856941 +v 1.426073 0.60405 10.863468 +v 1.429263 0.604141 10.870036 +v 1.432452 0.605134 10.876525 +v 1.435638 0.607013 10.882818 +v 1.438819 0.609742 10.8888 +v 1.441992 0.613274 10.8943615 +v 1.445156 0.617547 10.899402 +v 1.44831 0.622486 10.903828 +v 1.451452 0.628006 10.907558 +v 1.45458 0.634011 10.910522 +v 1.457694 0.640397 10.912663 +v 1.460793 0.647055 10.913939 +v 1.463876 0.653868 10.914321 +v -0.683038 2.038528 10.893793 +v -0.683053 2.030011 10.897452 +v -0.995546 1.998912 10.784322 +v -0.682994 2.046493 10.889044 +v -0.988144 2.007056 10.782517 +v -0.682923 2.053767 10.8832855 +v -0.978821 2.014839 10.780394 +v -0.682824 2.060228 10.876617 +v -0.968814 2.021989 10.777606 +v -0.682699 2.065765 10.869153 +v -0.958634 2.028334 10.774078 +v -0.682552 2.070282 10.86102 +v -0.948566 2.033745 10.76983 +v -0.682384 2.073703 10.852358 +v -0.93881 2.038116 10.764925 +v -0.682198 2.075968 10.843315 +v -0.929524 2.041363 10.759453 +v -0.681997 2.07704 10.834045 +v -0.920841 2.043426 10.753517 +v -0.681785 2.0769 10.824708 +v -0.91287 2.044268 10.747239 +v -0.905699 2.043872 10.7407465 +v -0.681566 2.07555 10.815463 +v -0.681343 2.073013 10.806468 +v -0.899392 2.042247 10.734175 +v -0.68112 2.069333 10.797878 +v -0.893988 2.039429 10.727668 +v -0.6809 2.064573 10.789838 +v -0.889503 2.035472 10.721366 +v -0.680689 2.058814 10.782488 +v -0.885924 2.030459 10.715412 +v -0.680488 2.052154 10.775951 +v -0.883212 2.024488 10.709945 +v -0.680302 2.044708 10.770342 +v -0.881302 2.017681 10.705099 +v -0.680134 2.036604 10.765754 +v -0.880104 2.010174 10.700998 +v -0.679986 2.027979 10.762267 +v -0.879509 2.002117 10.697755 +v -0.679862 2.018981 10.759941 +v -0.879394 1.993667 10.695468 +v -0.679763 2.009765 10.758815 +v -0.87963 1.984988 10.694221 +v -0.679691 2.000487 10.758908 +v -0.880092 1.976245 10.694068 +v -0.679648 1.991307 10.760219 +v -0.880675 1.967599 10.695047 +v -0.679633 1.982382 10.762726 +v -0.881301 1.959204 10.697161 +v -0.679648 1.973865 10.766386 +v -0.88193 1.951205 10.700384 +v -0.679691 1.9659 10.771135 +v -0.882564 1.943735 10.704656 +v -0.679763 1.958626 10.776893 +v -0.883247 1.936914 10.7098875 +v -0.679862 1.952165 10.783562 +v -0.884054 1.930848 10.715961 +v -0.679986 1.946628 10.791026 +v -0.885084 1.925628 10.722737 +v -0.680134 1.942111 10.799159 +v -0.886445 1.921331 10.730056 +v -0.680302 1.93869 10.807821 +v -0.888247 1.918018 10.737747 +v -0.680488 1.936425 10.816864 +v -0.890589 1.915733 10.745634 +v -0.680689 1.935353 10.826133 +v -0.893556 1.914504 10.753537 +v -0.6809 1.935493 10.83547 +v -0.897212 1.914339 10.761278 +v -0.68112 1.936843 10.844715 +v -0.901598 1.915231 10.768686 +v -0.681343 1.93938 10.85371 +v -0.906732 1.91715 10.7756 +v -0.681566 1.94306 10.862301 +v -0.912611 1.920053 10.781869 +v -0.681785 1.94782 10.87034 +v -0.919205 1.923875 10.78736 +v -0.681997 1.953579 10.877691 +v -0.926466 1.928537 10.791957 +v -0.682198 1.960239 10.884227 +v -0.934323 1.933948 10.795561 +v -0.682384 1.967685 10.889837 +v -0.942687 1.940002 10.798098 +v -0.682552 1.975789 10.894425 +v -0.95145 1.946583 10.799515 +v -0.682699 1.984414 10.897912 +v -0.960479 1.953569 10.799784 +v -0.682824 1.993412 10.900238 +v -0.969612 1.960837 10.79891 +v -0.682923 2.002628 10.901364 +v -0.978626 1.968264 10.796936 +v -0.682994 2.011906 10.901271 +v -0.987154 1.975747 10.793977 +v -0.683038 2.021086 10.899959 +v -0.994376 1.98324 10.790324 +v -0.339838 2.03404 10.8812065 +v -0.339828 2.025555 10.884848 +v -0.339867 2.041976 10.876486 +v -0.339914 2.049228 10.870769 +v -0.339978 2.055672 10.864151 +v -0.340059 2.061197 10.856746 +v -0.340156 2.065709 10.848681 +v -0.340266 2.06913 10.840094 +v -0.340388 2.071403 10.831132 +v -0.340519 2.072488 10.821948 +v -0.340657 2.072366 10.812699 +v -0.340801 2.07104 10.803544 +v -0.340947 2.068532 10.794639 +v -0.341093 2.064886 10.786136 +v -0.341236 2.060164 10.778182 +v -0.341375 2.054445 10.770912 +v -0.341506 2.04783 10.76445 +v -0.341627 2.040429 10.758907 +v -0.341737 2.032371 10.754379 +v -0.341834 2.023793 10.750941 +v -0.341915 2.014842 10.748654 +v -0.34198 2.00567 10.747556 +v -0.342027 1.996436 10.747667 +v -0.342055 1.987296 10.748984 +v -0.342065 1.978408 10.751484 +v -0.342055 1.969923 10.755125 +v -0.342027 1.961987 10.759845 +v -0.34198 1.954734 10.765563 +v -0.341915 1.948291 10.7721815 +v -0.341834 1.942766 10.779586 +v -0.341737 1.938254 10.787651 +v -0.341627 1.934832 10.796238 +v -0.341506 1.93256 10.8052 +v -0.341375 1.931475 10.814384 +v -0.341236 1.931597 10.823633 +v -0.341093 1.932923 10.832788 +v -0.340947 1.93543 10.841693 +v -0.340801 1.939077 10.850195 +v -0.340657 1.943799 10.8581505 +v -0.340519 1.949517 10.86542 +v -0.340388 1.956133 10.871882 +v -0.340266 1.963533 10.877425 +v -0.340156 1.971591 10.881953 +v -0.340059 1.98017 10.885391 +v -0.339978 1.989121 10.887678 +v -0.339914 1.998292 10.888775 +v -0.339867 2.007527 10.888665 +v -0.339838 2.016666 10.887348 +v 0.005859 2.018111 10.837599 +v 0.005868 2.010072 10.841051 +v 0.005832 2.025629 10.83312 +v 0.005787 2.032497 10.827692 +v 0.005725 2.038598 10.821408 +v 0.005648 2.043827 10.814374 +v 0.005556 2.048095 10.806712 +v 0.005452 2.051329 10.7985525 +v 0.005336 2.053473 10.790034 +v 0.005211 2.054491 10.781304 +v 0.00508 2.054365 10.7725115 +v 0.004943 2.053098 10.763805 +v 0.004804 2.050711 10.755336 +v 0.004665 2.047245 10.747249 +v 0.004529 2.042759 10.739681 +v 0.004397 2.03733 10.732763 +v 0.004273 2.031052 10.726612 +v 0.004157 2.024031 10.721334 +v 0.004052 2.016387 10.717019 +v 0.003961 2.008251 10.713742 +v 0.003883 1.999764 10.711558 +v 0.003822 1.991069 10.710505 +v 0.003777 1.982315 10.710598 +v 0.00375 1.973653 10.71184 +v 0.003741 1.96523 10.714207 +v 0.00375 1.957191 10.717659 +v 0.003777 1.949673 10.722138 +v 0.003822 1.942805 10.727566 +v 0.003883 1.936704 10.7338505 +v 0.003961 1.931475 10.740884 +v 0.004052 1.927207 10.748546 +v 0.004157 1.923973 10.756706 +v 0.004273 1.921829 10.765224 +v 0.004397 1.920811 10.773954 +v 0.004529 1.920937 10.782747 +v 0.004665 1.922204 10.791453 +v 0.004804 1.924591 10.799922 +v 0.004943 1.928057 10.808009 +v 0.00508 1.932543 10.8155775 +v 0.005211 1.937971 10.822496 +v 0.005336 1.94425 10.828646 +v 0.005452 1.951271 10.833924 +v 0.005556 1.958915 10.838239 +v 0.005648 1.96705 10.8415165 +v 0.005725 1.975538 10.843701 +v 0.005787 1.984233 10.844755 +v 0.005832 1.992987 10.84466 +v 0.005859 2.001649 10.843418 +v 0.354542 2.002023 10.793454 +v 0.35455 1.994402 10.796727 +v 0.354516 2.009149 10.789209 +v 0.354474 2.01566 10.784063 +v 0.354415 2.021443 10.778106 +v 0.354342 2.0264 10.771438 +v 0.354255 2.030445 10.764175 +v 0.354156 2.033511 10.756439 +v 0.354046 2.035543 10.748365 +v 0.353928 2.036508 10.740089 +v 0.353803 2.036389 10.731753 +v 0.353674 2.035188 10.723501 +v 0.353542 2.032925 10.715473 +v 0.353411 2.029639 10.707806 +v 0.353281 2.025387 10.700632 +v 0.353156 2.020241 10.694074 +v 0.353038 2.014289 10.688243 +v 0.352928 2.007633 10.68324 +v 0.352829 2.000388 10.67915 +v 0.352742 1.992676 10.6760435 +v 0.352669 1.98463 10.673972 +v 0.352611 1.976387 10.672973 +v 0.352568 1.968089 10.673062 +v 0.352543 1.959878 10.674239 +v 0.352534 1.951894 10.676483 +v 0.352543 1.944273 10.679756 +v 0.352568 1.937147 10.684001 +v 0.352611 1.930636 10.689147 +v 0.352669 1.924853 10.695104 +v 0.352742 1.919896 10.701772 +v 0.352829 1.91585 10.709035 +v 0.352928 1.912785 10.716771 +v 0.353038 1.910753 10.724845 +v 0.353156 1.909788 10.733121 +v 0.353281 1.909907 10.741456 +v 0.353411 1.911108 10.749709 +v 0.353542 1.913371 10.757737 +v 0.353674 1.916657 10.765404 +v 0.353803 1.920909 10.772578 +v 0.353928 1.926055 10.779136 +v 0.354046 1.932007 10.784967 +v 0.354156 1.938663 10.78997 +v 0.354255 1.945908 10.79406 +v 0.354342 1.95362 10.797167 +v 0.354415 1.961666 10.799238 +v 0.354474 1.969909 10.800237 +v 0.354516 1.978207 10.800147 +v 0.354542 1.986418 10.79897 +v 0.706213 1.985797 10.74893 +v 0.706222 1.978598 10.752022 +v 0.706189 1.992529 10.74492 +v 0.706149 1.998679 10.74006 +v 0.706094 2.004142 10.734432 +v 0.706025 2.008824 10.728134 +v 0.705943 2.012646 10.721272 +v 0.705849 2.015541 10.713965 +v 0.705745 2.017461 10.706338 +v 0.705634 2.018373 10.69852 +v 0.705516 2.01826 10.690646 +v 0.705394 2.017125 10.682851 +v 0.705269 2.014988 10.675267 +v 0.705145 2.011884 10.668025 +v 0.705023 2.007867 10.661248 +v 0.704905 2.003006 10.655053 +v 0.704793 1.997384 10.649545 +v 0.704689 1.991097 10.644819 +v 0.704596 1.984252 10.640955 +v 0.704514 1.976967 10.6380205 +v 0.704444 1.969367 10.636065 +v 0.704389 1.961581 10.63512 +v 0.704349 1.953742 10.635205 +v 0.704325 1.945986 10.636317 +v 0.704317 1.938444 10.638436 +v 0.704325 1.931245 10.641528 +v 0.704349 1.924513 10.645538 +v 0.704389 1.918363 10.650399 +v 0.704444 1.9129 10.656026 +v 0.704514 1.908217 10.662325 +v 0.704596 1.904396 10.669186 +v 0.704689 1.9015 10.676493 +v 0.704793 1.89958 10.68412 +v 0.704905 1.898669 10.691938 +v 0.705023 1.898781 10.699812 +v 0.705145 1.899916 10.707608 +v 0.705269 1.902054 10.715191 +v 0.705394 1.905157 10.722433 +v 0.705516 1.909174 10.72921 +v 0.705634 1.914035 10.735405 +v 0.705745 1.919658 10.740913 +v 0.705849 1.925945 10.745639 +v 0.705943 1.932789 10.749503 +v 0.706025 1.940074 10.752439 +v 0.706094 1.947675 10.754395 +v 0.706149 1.955461 10.755338 +v 0.706189 1.963299 10.755253 +v 0.706213 1.971056 10.754142 +v 1.060874 1.969433 10.704029 +v 1.060881 1.96266 10.706937 +v 1.060851 1.975767 10.700255 +v 1.060813 1.981554 10.695683 +v 1.060761 1.986694 10.690387 +v 1.060696 1.991099 10.684461 +v 1.060619 1.994695 10.678005 +v 1.060531 1.997419 10.67113 +v 1.060433 1.999226 10.663954 +v 1.060328 2.000083 10.656598 +v 1.060217 1.999977 10.64919 +v 1.060102 1.99891 10.641855 +v 1.059985 1.996899 10.634719 +v 1.059868 1.993978 10.627905 +v 1.059753 1.990199 10.621529 +v 1.059642 1.985625 10.6157 +v 1.059537 1.980335 10.610518 +v 1.05944 1.97442 10.606071 +v 1.059352 1.96798 10.602436 +v 1.059274 1.961126 10.599674 +v 1.059209 1.953974 10.597834 +v 1.059158 1.946648 10.596946 +v 1.05912 1.939273 10.597026 +v 1.059097 1.931975 10.598072 +v 1.059089 1.924879 10.600066 +v 1.059097 1.918106 10.602975 +v 1.05912 1.911772 10.606748 +v 1.059158 1.905985 10.611321 +v 1.059209 1.900845 10.616616 +v 1.059274 1.89644 10.622542 +v 1.059352 1.892844 10.628998 +v 1.05944 1.890119 10.635873 +v 1.059537 1.888313 10.64305 +v 1.059642 1.887455 10.650405 +v 1.059753 1.887561 10.657814 +v 1.059868 1.888629 10.665148 +v 1.059985 1.89064 10.672284 +v 1.060102 1.89356 10.679098 +v 1.060217 1.89734 10.685474 +v 1.060328 1.901913 10.691303 +v 1.060433 1.907203 10.6964855 +v 1.060531 1.913119 10.7009325 +v 1.060619 1.919559 10.704567 +v 1.060696 1.926413 10.707329 +v 1.060761 1.933564 10.709169 +v 1.060813 1.94089 10.710057 +v 1.060851 1.948265 10.709978 +v 1.060874 1.955564 10.708932 +v 1.415453 1.953073 10.659137 +v 1.41853 1.946587 10.661473 +v 1.412361 1.959154 10.655987 +v 1.409255 1.964729 10.652083 +v 1.406135 1.969703 10.647497 +v 1.403002 1.973992 10.642311 +v 1.399856 1.977526 10.636622 +v 1.3967 1.980243 10.630531 +v 1.393534 1.9821 10.624149 +v 1.390359 1.983066 10.617591 +v 1.387178 1.983125 10.610975 +v 1.383992 1.982277 10.604421 +v 1.380803 1.980538 10.598047 +v 1.377613 1.977939 10.591969 +v 1.374424 1.974526 10.586296 +v 1.371238 1.970358 10.581134 +v 1.368057 1.965508 10.576576 +v 1.364883 1.960061 10.572709 +v 1.361717 1.95411 10.569605 +v 1.358562 1.947761 10.567325 +v 1.355418 1.941122 10.565914 +v 1.352288 1.934311 10.565404 +v 1.349172 1.927444 10.565811 +v 1.34607 1.920642 10.567135 +v 1.342985 1.914024 10.569361 +v 1.34607 1.907478 10.571789 +v 1.349172 1.901355 10.575034 +v 1.352288 1.895758 10.579033 +v 1.355418 1.89078 10.583711 +v 1.358562 1.886503 10.58898 +v 1.361717 1.882998 10.594745 +v 1.364883 1.88032 10.600899 +v 1.368057 1.878514 10.607331 +v 1.371238 1.877606 10.613923 +v 1.374424 1.877608 10.620558 +v 1.377613 1.878518 10.627115 +v 1.380803 1.880317 10.633477 +v 1.383992 1.882971 10.639528 +v 1.387178 1.886431 10.645158 +v 1.390359 1.890635 10.650267 +v 1.393534 1.895507 10.654761 +v 1.3967 1.900963 10.658558 +v 1.399856 1.906904 10.661588 +v 1.403002 1.913228 10.663792 +v 1.406135 1.919824 10.66513 +v 1.409255 1.926575 10.665571 +v 1.412361 1.933365 10.665104 +v 1.415453 1.940075 10.663733 +v -0.525747 3.244035 10.223295 +v -0.52574 3.237772 10.228887 +v -0.837486 3.193905 10.161576 +v -0.525768 3.249512 10.216929 +v -0.832755 3.199153 10.15725 +v -0.525802 3.254109 10.2099 +v -0.826066 3.204015 10.152704 +v -0.52585 3.257747 10.202326 +v -0.81834 3.20828 10.147838 +v -0.81017 3.211788 10.142636 +v -0.52591 3.260365 10.194339 +v -0.52598 3.261918 10.186073 +v -0.801931 3.21443 10.13714 +v -0.526061 3.262379 10.177671 +v -0.793875 3.216127 10.131422 +v -0.526151 3.26174 10.169277 +v -0.786191 3.216828 10.125576 +v -0.526247 3.260013 10.161034 +v -0.779025 3.216507 10.119708 +v -0.772491 3.215161 10.11393 +v -0.526349 3.257226 10.153084 +v -0.526454 3.253427 10.145561 +v -0.766673 3.21281 10.108359 +v -0.526561 3.248682 10.138595 +v -0.761631 3.209497 10.103109 +v -0.526668 3.243071 10.132306 +v -0.757399 3.205286 10.098291 +v -0.526774 3.236691 10.126801 +v -0.753983 3.200264 10.094009 +v -0.526876 3.229651 10.122173 +v -0.751365 3.194532 10.09036 +v -0.526972 3.222071 10.118502 +v -0.749499 3.188209 10.087426 +v -0.527061 3.21408 10.115851 +v -0.74832 3.181427 10.085276 +v -0.527142 3.205817 10.114266 +v -0.747741 3.174324 10.083967 +v -0.527213 3.197421 10.113773 +v -0.747661 3.167046 10.083535 +v -0.527273 3.189037 10.114381 +v -0.747971 3.159736 10.084003 +v -0.52732 3.180808 10.116079 +v -0.74856 3.152539 10.085376 +v -0.527355 3.172876 10.118839 +v -0.749325 3.14559 10.08764 +v -0.527376 3.165374 10.122613 +v -0.750179 3.139017 10.090764 +v -0.527383 3.158433 10.127337 +v -0.527376 3.152171 10.132929 +v -0.751927 3.127452 10.099388 +v -0.527355 3.146694 10.139294 +v -0.752781 3.122654 10.104741 +v -0.52732 3.142097 10.146324 +v -0.753644 3.118617 10.110665 +v -0.527273 3.138458 10.153897 +v -0.754567 3.115403 10.117048 +v -0.527213 3.13584 10.161885 +v -0.755619 3.113055 10.123768 +v -0.527142 3.134287 10.170151 +v -0.756879 3.111605 10.130694 +v -0.527061 3.133826 10.178552 +v -0.758434 3.111064 10.137685 +v -0.526972 3.134465 10.186946 +v -0.760362 3.111432 10.144602 +v -0.526876 3.136193 10.195189 +v -0.762736 3.112688 10.151301 +v -0.765614 3.114798 10.157646 +v -0.526774 3.13898 10.20314 +v -0.526668 3.142779 10.210663 +v -0.769037 3.117711 10.1635065 +v -0.526561 3.147524 10.2176285 +v -0.773029 3.121361 10.168762 +v -0.526454 3.153134 10.223918 +v -0.777592 3.12567 10.173306 +v -0.526349 3.159514 10.2294235 +v -0.782709 3.130546 10.177048 +v -0.526247 3.166555 10.234051 +v -0.788342 3.135891 10.179915 +v -0.526151 3.174135 10.237722 +v -0.794431 3.141598 10.181855 +v -0.800895 3.147556 10.182835 +v -0.526061 3.182125 10.240372 +v -0.52598 3.190389 10.241958 +v -0.807628 3.153655 10.182846 +v -0.814488 3.159787 10.181902 +v -0.52591 3.198784 10.242451 +v -0.52585 3.207168 10.241843 +v -0.821286 3.165854 10.180046 +v -0.525802 3.215397 10.240144 +v -0.827744 3.171777 10.177353 +v -0.525768 3.22333 10.237385 +v -0.83342 3.177508 10.173946 +v -0.525747 3.230831 10.233611 +v -0.837585 3.183058 10.170018 +v -0.165556 3.228473 10.203745 +v -0.165549 3.22238 10.209186 +v -0.165576 3.233803 10.197554 +v -0.16561 3.238278 10.190718 +v -0.165656 3.241821 10.183353 +v -0.165714 3.244372 10.175586 +v -0.165783 3.245887 10.16755 +v -0.165861 3.24634 10.159383 +v -0.165948 3.245724 10.151223 +v -0.166042 3.244049 10.143211 +v -0.166141 3.241344 10.135483 +v -0.166243 3.237655 10.128173 +v -0.166347 3.233045 10.121405 +v -0.166451 3.227593 10.115294 +v -0.166554 3.221392 10.109946 +v -0.166653 3.214548 10.105451 +v -0.166746 3.20718 10.101888 +v -0.166833 3.199411 10.099316 +v -0.166912 3.191377 10.09778 +v -0.16698 3.183213 10.097306 +v -0.167038 3.17506 10.097902 +v -0.167085 3.167057 10.099558 +v -0.167118 3.159341 10.102246 +v -0.167139 3.152044 10.105919 +v -0.167145 3.145291 10.110515 +v -0.167139 3.139198 10.115956 +v -0.167118 3.133868 10.122147 +v -0.167085 3.129394 10.1289835 +v -0.167038 3.125851 10.136348 +v -0.16698 3.1233 10.144115 +v -0.166912 3.121784 10.152151 +v -0.166833 3.121331 10.160318 +v -0.166746 3.121947 10.168478 +v -0.166653 3.123622 10.17649 +v -0.166554 3.126327 10.184218 +v -0.166451 3.130016 10.191528 +v -0.166347 3.134627 10.1982975 +v -0.166243 3.140079 10.204407 +v -0.166141 3.146279 10.209755 +v -0.166042 3.153123 10.21425 +v -0.165948 3.160492 10.2178135 +v -0.165861 3.16826 10.220385 +v -0.165783 3.176295 10.221921 +v -0.165714 3.184458 10.222395 +v -0.165656 3.192612 10.221799 +v -0.16561 3.200615 10.220143 +v -0.165576 3.20833 10.217455 +v -0.165556 3.215627 10.213782 +v 0.198075 3.20212 10.170749 +v 0.198082 3.196366 10.175888 +v 0.198056 3.207153 10.164899 +v 0.198024 3.211376 10.158438 +v 0.19798 3.214719 10.151478 +v 0.197926 3.217124 10.144136 +v 0.19786 3.218549 10.136539 +v 0.197786 3.218971 10.128816 +v 0.197704 3.218382 10.1211 +v 0.197615 3.216793 10.1135235 +v 0.197522 3.21423 10.106215 +v 0.197425 3.210737 10.0992985 +v 0.197326 3.206374 10.0928955 +v 0.197228 3.201216 10.087112 +v 0.197131 3.195351 10.08205 +v 0.197037 3.18888 10.077795 +v 0.196949 3.181912 10.074419 +v 0.196867 3.174568 10.071981 +v 0.196792 3.166972 10.070522 +v 0.196727 3.159256 10.070068 +v 0.196672 3.15155 10.070625 +v 0.196629 3.143987 10.072184 +v 0.196597 3.136697 10.074719 +v 0.196578 3.129803 10.078187 +v 0.196571 3.123424 10.082527 +v 0.196578 3.11767 10.087667 +v 0.196597 3.112637 10.093516 +v 0.196629 3.108414 10.0999775 +v 0.196672 3.105071 10.106938 +v 0.196727 3.102666 10.11428 +v 0.196792 3.101241 10.121877 +v 0.196867 3.100819 10.129601 +v 0.196949 3.101408 10.137316 +v 0.197037 3.102997 10.144893 +v 0.197131 3.10556 10.152202 +v 0.197228 3.109053 10.159117 +v 0.197326 3.113416 10.165521 +v 0.197425 3.118574 10.171303 +v 0.197522 3.124439 10.176365 +v 0.197615 3.13091 10.180621 +v 0.197704 3.137878 10.183996 +v 0.197786 3.145222 10.186434 +v 0.19786 3.152818 10.187893 +v 0.197926 3.160534 10.188348 +v 0.19798 3.16824 10.187791 +v 0.198024 3.175803 10.186231 +v 0.198056 3.183093 10.183696 +v 0.198075 3.189987 10.180229 +v 0.565361 3.175514 10.137412 +v 0.565367 3.17009 10.142256 +v 0.565343 3.180257 10.131898 +v 0.565313 3.184238 10.125809 +v 0.565272 3.187389 10.119248 +v 0.56522 3.189655 10.112329 +v 0.565158 3.190999 10.105167 +v 0.565088 3.191397 10.097888 +v 0.565011 3.190842 10.090615 +v 0.564928 3.189344 10.083473 +v 0.564839 3.186928 10.076584 +v 0.564748 3.183635 10.0700655 +v 0.564655 3.179523 10.06403 +v 0.564562 3.174662 10.058579 +v 0.564471 3.169133 10.053808 +v 0.564383 3.163034 10.049797 +v 0.564299 3.156466 10.046616 +v 0.564222 3.149544 10.044318 +v 0.564152 3.142385 10.042943 +v 0.56409 3.135111 10.042514 +v 0.564039 3.127848 10.043039 +v 0.563998 3.12072 10.044509 +v 0.563968 3.113848 10.046898 +v 0.563949 3.107351 10.050167 +v 0.563943 3.101338 10.054258 +v 0.563949 3.095914 10.059102 +v 0.563968 3.091171 10.064616 +v 0.563998 3.08719 10.070705 +v 0.564039 3.084039 10.077266 +v 0.56409 3.081772 10.0841875 +v 0.564152 3.080429 10.091347 +v 0.564222 3.080031 10.098627 +v 0.564299 3.080586 10.105899 +v 0.564383 3.082084 10.113041 +v 0.564471 3.0845 10.11993 +v 0.564562 3.087792 10.126449 +v 0.564655 3.091904 10.132485 +v 0.564748 3.096766 10.137935 +v 0.564839 3.102294 10.142706 +v 0.564928 3.108394 10.146717 +v 0.565011 3.114962 10.1498995 +v 0.565088 3.121884 10.152197 +v 0.565158 3.129043 10.153572 +v 0.56522 3.136316 10.154 +v 0.565272 3.143579 10.153475 +v 0.565313 3.150708 10.152005 +v 0.565343 3.157579 10.149616 +v 0.565361 3.164077 10.146347 +v 0.936301 3.148642 10.1037445 +v 0.936307 3.143552 10.10829 +v 0.936284 3.153094 10.098569 +v 0.936256 3.15683 10.0928545 +v 0.936217 3.159787 10.086697 +v 0.936169 3.161914 10.080203 +v 0.936111 3.163175 10.073483 +v 0.936045 3.163548 10.066652 +v 0.935973 3.163027 10.059827 +v 0.935894 3.161621 10.053124 +v 0.935812 3.159354 10.046659 +v 0.935726 3.156264 10.040542 +v 0.935639 3.152405 10.034878 +v 0.935552 3.147843 10.029763 +v 0.935466 3.142655 10.025285 +v 0.935383 3.13693 10.021521 +v 0.935305 3.130767 10.018535 +v 0.935232 3.124271 10.016379 +v 0.935166 3.117552 10.015088 +v 0.935109 3.110727 10.014686 +v 0.93506 3.103911 10.015179 +v 0.935022 3.097221 10.016558 +v 0.934994 3.090772 10.018801 +v 0.934977 3.084674 10.021868 +v 0.934971 3.079032 10.025707 +v 0.934977 3.073942 10.030253 +v 0.934994 3.06949 10.035428 +v 0.935022 3.065754 10.041142 +v 0.93506 3.062798 10.0473 +v 0.935109 3.06067 10.053794 +v 0.935166 3.059409 10.060514 +v 0.935232 3.059036 10.067345 +v 0.935305 3.059557 10.07417 +v 0.935383 3.060963 10.0808735 +v 0.935466 3.06323 10.087338 +v 0.935552 3.06632 10.093455 +v 0.935639 3.070179 10.099119 +v 0.935726 3.074741 10.104234 +v 0.935812 3.079929 10.108712 +v 0.935894 3.085654 10.112476 +v 0.935973 3.091817 10.115462 +v 0.936045 3.098313 10.117618 +v 0.936111 3.105032 10.118909 +v 0.936169 3.111858 10.119311 +v 0.936217 3.118673 10.118818 +v 0.936256 3.125363 10.117439 +v 0.936284 3.131812 10.115196 +v 0.936301 3.13791 10.112129 +v 1.30806 3.121712 10.070001 +v 1.310901 3.116753 10.073988 +v 1.305208 3.126078 10.065421 +v 1.302345 3.12978 10.060331 +v 1.299472 3.132757 10.054822 +v 1.296589 3.13496 10.04899 +v 1.293697 3.136353 10.042941 +v 1.290796 3.136916 10.03678 +v 1.287889 3.13664 10.030619 +v 1.284975 3.135534 10.024566 +v 1.282057 3.133618 10.018729 +v 1.279134 3.130927 10.013212 +v 1.27621 3.12751 10.008115 +v 1.273285 3.123428 10.003529 +v 1.270361 3.118753 9.999538 +v 1.267439 3.113567 9.996213 +v 1.26452 3.107963 9.993618 +v 1.261607 3.102038 9.991801 +v 1.2587 3.095898 9.990799 +v 1.255801 3.08965 9.990633 +v 1.25291 3.083404 9.991311 +v 1.250029 3.07727 9.992827 +v 1.247159 3.071357 9.99516 +v 1.2443 3.065769 9.998275 +v 1.241452 3.060607 10.002123 +v 1.2443 3.055624 10.006202 +v 1.247159 3.05125 10.01087 +v 1.250029 3.047555 10.016043 +v 1.25291 3.0446 10.021627 +v 1.255801 3.042431 10.027524 +v 1.2587 3.04108 10.0336275 +v 1.261607 3.040567 10.039827 +v 1.26452 3.040897 10.046015 +v 1.267439 3.042059 10.052081 +v 1.270361 3.04403 10.057917 +v 1.273285 3.046772 10.063419 +v 1.27621 3.050234 10.068489 +v 1.279134 3.054354 10.073038 +v 1.282057 3.059055 10.076983 +v 1.284975 3.064255 10.0802555 +v 1.287889 3.069861 10.082793 +v 1.290796 3.075773 10.08455 +v 1.293697 3.081886 10.085495 +v 1.296589 3.088093 10.085606 +v 1.299472 3.094284 10.08488 +v 1.302345 3.10035 10.083324 +v 1.305208 3.106185 10.080964 +v 1.30806 3.111685 10.077835 +v -0.397074 4.06102 9.119724 +v -0.610356 4.038801 9.105744 +v -0.397077 4.062512 9.113364 +v -0.397087 4.06316 9.106863 +v -0.606494 4.03991 9.099012 +v -0.397103 4.062954 9.100332 +v -0.601211 4.04027 9.092317 +v -0.397124 4.061895 9.093883 +v -0.59511 4.039821 9.085759 +v -0.397152 4.060003 9.087628 +v -0.588674 4.038535 9.079437 +v -0.397185 4.057311 9.081671 +v -0.582255 4.036411 9.073449 +v -0.397222 4.053863 9.076117 +v -0.576105 4.033472 9.067889 +v -0.397263 4.049719 9.071059 +v -0.570405 4.029764 9.062844 +v -0.397308 4.04495 9.066584 +v -0.565289 4.025345 9.058395 +v -0.560853 4.02029 9.054613 +v -0.397355 4.039638 9.062769 +v -0.397403 4.033873 9.059678 +v -0.557162 4.014686 9.051558 +v -0.397453 4.027754 9.057366 +v -0.554254 4.008629 9.04928 +v -0.397502 4.021386 9.055871 +v -0.552142 4.002222 9.047816 +v -0.397551 4.014878 9.055219 +v -0.550814 3.995577 9.047192 +v -0.397598 4.008341 9.055421 +v -0.550234 3.988811 9.047419 +v -0.397642 4.001887 9.056474 +v -0.550344 3.982043 9.048499 +v -0.397683 3.995626 9.05836 +v -0.55106 3.975397 9.050416 +v -0.39772 3.989665 9.061046 +v -0.552277 3.968996 9.053144 +v -0.397753 3.984108 9.064487 +v -0.553868 3.962961 9.056645 +v -0.397781 3.979047 9.068623 +v -0.555693 3.957411 9.060866 +v -0.397803 3.974571 9.073384 +v -0.557602 3.952457 9.065741 +v -0.397819 3.970756 9.078688 +v -0.559446 3.948201 9.071195 +v -0.397828 3.967666 9.084445 +v -0.561094 3.944733 9.077138 +v -0.397831 3.965356 9.090556 +v -0.562448 3.942122 9.083472 +v -0.397828 3.963864 9.096917 +v -0.563451 3.940421 9.090088 +v -0.397819 3.963215 9.103418 +v -0.564101 3.939658 9.096869 +v -0.397803 3.963422 9.109949 +v -0.564442 3.939838 9.103696 +v -0.397781 3.964481 9.116397 +v -0.564559 3.940946 9.110447 +v -0.397753 3.966372 9.122653 +v -0.564561 3.942947 9.117 +v -0.39772 3.969065 9.128609 +v -0.564568 3.945789 9.123239 +v -0.397683 3.972513 9.134164 +v -0.564698 3.949406 9.129053 +v -0.397642 3.976657 9.139222 +v -0.565062 3.953723 9.13434 +v -0.397598 3.981426 9.143697 +v -0.565752 3.958651 9.139008 +v -0.397551 3.986738 9.147512 +v -0.566846 3.964097 9.142976 +v -0.397502 3.992503 9.150602 +v -0.568399 3.969959 9.1461735 +v -0.397453 3.998621 9.152915 +v -0.570448 3.976132 9.148545 +v -0.397403 4.004989 9.154409 +v -0.573009 3.982507 9.15005 +v -0.397355 4.011498 9.155061 +v -0.57608 3.988972 9.15066 +v -0.397308 4.018035 9.154859 +v -0.579635 3.995416 9.150362 +v -0.583628 4.00173 9.14916 +v -0.397263 4.024489 9.153806 +v -0.587986 4.007809 9.14707 +v -0.397222 4.03075 9.15192 +v -0.397185 4.03671 9.149234 +v -0.592606 4.013552 9.144127 +v -0.597343 4.01887 9.140378 +v -0.397152 4.042268 9.145794 +v -0.397124 4.047329 9.141658 +v -0.601996 4.023683 9.13589 +v -0.397103 4.051805 9.136897 +v -0.606274 4.02793 9.130743 +v -0.397087 4.05562 9.131592 +v -0.609771 4.031575 9.125034 +v -0.397077 4.05871 9.125836 +v -0.611946 4.034602 9.118879 +v -0.120844 4.048844 9.109376 +v -0.12084 4.047391 9.115569 +v -0.120853 4.049475 9.103045 +v -0.120869 4.049273 9.096686 +v -0.12089 4.048242 9.090407 +v -0.120917 4.046399 9.084315 +v -0.120948 4.043776 9.078515 +v -0.120985 4.040418 9.073106 +v -0.121025 4.036382 9.068181 +v -0.121068 4.031737 9.063823 +v -0.121114 4.026564 9.060108 +v -0.121161 4.020949 9.057099 +v -0.121209 4.01499 9.054847 +v -0.121258 4.008788 9.053391 +v -0.121305 4.002449 9.052755 +v -0.121351 3.996083 9.052952 +v -0.121394 3.989797 9.053977 +v -0.121434 3.9837 9.055813 +v -0.12147 3.977895 9.058428 +v -0.121502 3.972482 9.061778 +v -0.121529 3.967554 9.065805 +v -0.12155 3.963195 9.07044 +v -0.121566 3.959479 9.075605 +v -0.121575 3.956471 9.081211 +v -0.121578 3.954221 9.087161 +v -0.121575 3.952768 9.093354 +v -0.121566 3.952137 9.099685 +v -0.12155 3.952339 9.106044 +v -0.121529 3.953371 9.112323 +v -0.121502 3.955213 9.118415 +v -0.12147 3.957836 9.124215 +v -0.121434 3.961194 9.129624 +v -0.121394 3.96523 9.134549 +v -0.121351 3.969875 9.138907 +v -0.121305 3.975049 9.142622 +v -0.121258 3.980663 9.145631 +v -0.121209 3.986623 9.147883 +v -0.121161 3.992824 9.149339 +v -0.121114 3.999163 9.149975 +v -0.121068 4.005529 9.149778 +v -0.121025 4.011815 9.148753 +v -0.120985 4.017913 9.146917 +v -0.120948 4.023717 9.144302 +v -0.120917 4.02913 9.140952 +v -0.12089 4.034058 9.136925 +v -0.120869 4.038417 9.13229 +v -0.120853 4.042133 9.127125 +v -0.120844 4.045141 9.121519 +v 0.158124 4.026143 9.102775 +v 0.158127 4.024761 9.108669 +v 0.158115 4.026742 9.09675 +v 0.1581 4.026549 9.090697 +v 0.15808 4.025565 9.084721 +v 0.158054 4.023808 9.078923 +v 0.158024 4.021309 9.073402 +v 0.15799 4.018109 9.068253 +v 0.157951 4.014264 9.063564 +v 0.15791 4.009839 9.059416 +v 0.157867 4.00491 9.055879 +v 0.157821 3.999561 9.053013 +v 0.157776 3.993885 9.050868 +v 0.15773 3.987977 9.049481 +v 0.157685 3.98194 9.048875 +v 0.157641 3.975876 9.049061 +v 0.1576 3.969889 9.050035 +v 0.157562 3.964082 9.05178 +v 0.157527 3.958554 9.054268 +v 0.157497 3.953399 9.057455 +v 0.157471 3.948706 9.061286 +v 0.157451 3.944556 9.065697 +v 0.157436 3.941018 9.070612 +v 0.157427 3.938154 9.075946 +v 0.157424 3.936012 9.081609 +v 0.157427 3.93463 9.087503 +v 0.157436 3.934031 9.093528 +v 0.157451 3.934224 9.099581 +v 0.157471 3.935208 9.105557 +v 0.157497 3.936965 9.111355 +v 0.157527 3.939464 9.116876 +v 0.157562 3.942664 9.122025 +v 0.1576 3.94651 9.126714 +v 0.157641 3.950934 9.130862 +v 0.157685 3.955863 9.134399 +v 0.15773 3.961212 9.137265 +v 0.157776 3.966888 9.13941 +v 0.157821 3.972796 9.140797 +v 0.157867 3.978833 9.141403 +v 0.15791 3.984897 9.141217 +v 0.157951 3.990884 9.140243 +v 0.15799 3.996691 9.138498 +v 0.158024 4.002219 9.13601 +v 0.158054 4.007374 9.132823 +v 0.15808 4.012067 9.128992 +v 0.1581 4.016218 9.124581 +v 0.158115 4.019755 9.119666 +v 0.158124 4.022619 9.114332 +v 0.439895 4.003216 9.096102 +v 0.439898 4.001903 9.1017 +v 0.439887 4.003785 9.09038 +v 0.439873 4.003601 9.084632 +v 0.439854 4.002667 9.078957 +v 0.439829 4.000999 9.07345 +v 0.439801 3.998625 9.068207 +v 0.439768 3.995586 9.063318 +v 0.439731 3.991934 9.058865 +v 0.439692 3.987732 9.054925 +v 0.439651 3.983051 9.051566 +v 0.439608 3.977972 9.048844 +v 0.439565 3.972581 9.046807 +v 0.439521 3.966971 9.04549 +v 0.439478 3.961237 9.044914 +v 0.439437 3.955478 9.045091 +v 0.439398 3.949793 9.046016 +v 0.439361 3.944278 9.047674 +v 0.439328 3.939028 9.050036 +v 0.4393 3.934132 9.053062 +v 0.439275 3.929676 9.056701 +v 0.439256 3.925734 9.06089 +v 0.439242 3.922374 9.065558 +v 0.439234 3.919654 9.070624 +v 0.439231 3.91762 9.076001 +v 0.439234 3.916308 9.081599 +v 0.439242 3.915738 9.087321 +v 0.439256 3.915923 9.093069 +v 0.439275 3.916857 9.098744 +v 0.4393 3.918525 9.104251 +v 0.439328 3.920899 9.109494 +v 0.439361 3.923938 9.114383 +v 0.439398 3.927589 9.118836 +v 0.439437 3.931792 9.122776 +v 0.439478 3.936473 9.126135 +v 0.439521 3.941552 9.128857 +v 0.439565 3.946943 9.130893 +v 0.439608 3.952553 9.132211 +v 0.439651 3.958287 9.132786 +v 0.439692 3.964045 9.13261 +v 0.439731 3.969731 9.131685 +v 0.439768 3.975246 9.130027 +v 0.439801 3.980496 9.127665 +v 0.439829 3.985391 9.124638 +v 0.439854 3.989848 9.121 +v 0.439873 3.99379 9.116811 +v 0.439887 3.997149 9.112143 +v 0.439895 3.999869 9.107077 +v 0.724471 3.980061 9.089363 +v 0.724473 3.978818 9.094661 +v 0.724462 3.980599 9.083947 +v 0.724449 3.980425 9.078507 +v 0.724431 3.979541 9.073135 +v 0.724408 3.977962 9.067923 +v 0.724381 3.975715 9.062961 +v 0.72435 3.972839 9.058333 +v 0.724315 3.969382 9.054118 +v 0.724278 3.965405 9.050389 +v 0.724239 3.960975 9.04721 +v 0.724199 3.956167 9.044634 +v 0.724157 3.951065 9.042706 +v 0.724116 3.945755 9.041459 +v 0.724076 3.940328 9.040915 +v 0.724036 3.934877 9.041081 +v 0.723999 3.929496 9.041957 +v 0.723965 3.924276 9.043526 +v 0.723934 3.919307 9.045762 +v 0.723907 3.914674 9.048626 +v 0.723884 3.910456 9.052071 +v 0.723865 3.906725 9.056035 +v 0.723852 3.903545 9.060453 +v 0.723844 3.90097 9.065248 +v 0.723841 3.899045 9.070338 +v 0.723844 3.897803 9.075636 +v 0.723852 3.897264 9.081051 +v 0.723865 3.897439 9.086492 +v 0.723884 3.898323 9.091864 +v 0.723907 3.899902 9.097075 +v 0.723934 3.902149 9.102038 +v 0.723965 3.905025 9.106666 +v 0.723999 3.908481 9.11088 +v 0.724036 3.912458 9.114609 +v 0.724076 3.916889 9.117789 +v 0.724116 3.921696 9.120365 +v 0.724157 3.926799 9.122292 +v 0.724199 3.932109 9.123539 +v 0.724239 3.937535 9.124084 +v 0.724278 3.942986 9.123917 +v 0.724315 3.948367 9.123042 +v 0.72435 3.953587 9.121473 +v 0.724381 3.958556 9.119237 +v 0.724408 3.96319 9.116372 +v 0.724431 3.967408 9.112928 +v 0.724449 3.971139 9.108963 +v 0.724462 3.974319 9.104546 +v 0.724471 3.976893 9.099751 +v 1.009563 3.956863 9.082611 +v 1.011852 3.955506 9.087553 +v 1.007269 3.957558 9.077554 +v 1.00497 3.957579 9.072469 +v 1.002667 3.95693 9.067443 +v 1.000358 3.955624 9.062564 +v 0.998045 3.953684 9.057916 +v 0.995729 3.951147 9.053579 +v 0.993408 3.948058 9.04963 +v 0.991085 3.944473 9.046137 +v 0.988759 3.940455 9.043161 +v 0.986432 3.936076 9.040755 +v 0.984103 3.931412 9.03896 +v 0.981774 3.926547 9.03781 +v 0.979446 3.921566 9.037325 +v 0.977118 3.916558 9.037516 +v 0.974793 3.911611 9.03838 +v 0.972469 3.906812 9.039904 +v 0.970149 3.902247 9.042064 +v 0.967832 3.897997 9.044825 +v 0.96552 3.894138 9.048139 +v 0.963212 3.890739 9.051953 +v 0.960909 3.887862 9.056201 +v 0.958612 3.885559 9.060814 +v 0.95632 3.883873 9.065712 +v 0.958612 3.882539 9.070717 +v 0.960909 3.881877 9.07583 +v 0.963212 3.881894 9.080961 +v 0.96552 3.882587 9.086022 +v 0.967832 3.88394 9.090926 +v 0.970149 3.885927 9.095588 +v 0.972469 3.888511 9.099927 +v 0.974793 3.891643 9.10387 +v 0.977118 3.895266 9.1073475 +v 0.979446 3.899316 9.1103 +v 0.981774 3.90372 9.112676 +v 0.984103 3.908399 9.114436 +v 0.986432 3.913271 9.115549 +v 0.988759 3.918248 9.115995 +v 0.991085 3.923243 9.115768 +v 0.993408 3.928167 9.114869 +v 0.995729 3.932933 9.113315 +v 0.998045 3.937458 9.111132 +v 1.000358 3.941661 9.108357 +v 1.002667 3.945468 9.105036 +v 1.00497 3.948811 9.101228 +v 1.007269 3.95163 9.096995 +v 1.009563 3.953875 9.092411 +v -0.569235 3.935914 8.891252 +v -0.560771 3.935621 8.895409 +v -0.552434 3.936536 8.899723 +v -0.544367 3.938644 8.904122 +v -0.536708 3.941907 8.908529 +v -0.529588 3.946271 8.912869 +v -0.523128 3.95166 8.917069 +v -0.517439 3.957983 8.921056 +v -0.512619 3.965132 8.924762 +v -0.508749 3.972983 8.928123 +v -0.505897 3.981403 8.931083 +v -0.504111 3.990247 8.93359 +v -0.503421 3.999365 8.935601 +v -0.50384 4.0086 8.937083 +v -0.505359 4.017794 8.938009 +v -0.507954 4.02679 8.938364 +v -0.51158 4.035434 8.938142 +v -0.516174 4.043578 8.937347 +v -0.521658 4.051083 8.935992 +v -0.527939 4.05782 8.934101 +v -0.534909 4.063674 8.931705 +v -0.542448 4.068545 8.928846 +v -0.550427 4.07235 8.925573 +v -0.558711 4.075023 8.921941 +v -0.567157 4.076519 8.918013 +v -0.57562 4.076811 8.913857 +v -0.583957 4.075896 8.909542 +v -0.592024 4.073789 8.905144 +v -0.599683 4.070526 8.900736 +v -0.606803 4.066162 8.896396 +v -0.613263 4.060772 8.892196 +v -0.618952 4.054449 8.888209 +v -0.623772 4.047301 8.884504 +v -0.627642 4.03945 8.881142 +v -0.630494 4.03103 8.878183 +v -0.63228 4.022186 8.875676 +v -0.63297 4.013068 8.873664 +v -0.632551 4.003833 8.872183 +v -0.631032 3.994639 8.871256 +v -0.628437 3.985643 8.870901 +v -0.624811 3.976999 8.871123 +v -0.620217 3.968855 8.871918 +v -0.614733 3.96135 8.873273 +v -0.608452 3.954613 8.875165 +v -0.601483 3.948759 8.87756 +v -0.593944 3.943888 8.880419 +v -0.585964 3.940083 8.883693 +v -0.57768 3.93741 8.887324 +v -0.449793 3.97182 8.72739 +v -0.456719 3.972427 8.721816 +v -0.442958 3.972363 8.733079 +v -0.436332 3.974048 8.738788 +v -0.430029 3.976844 8.744417 +v -0.424155 3.980705 8.749872 +v -0.418811 3.985564 8.755057 +v -0.414089 3.991338 8.759886 +v -0.41007 3.997928 8.764275 +v -0.406823 4.005222 8.768148 +v -0.404402 4.013095 8.771441 +v -0.40285 4.021412 8.774096 +v -0.402192 4.03003 8.776068 +v -0.402441 4.038803 8.777323 +v -0.403592 4.04758 8.77784 +v -0.405625 4.056211 8.77761 +v -0.408505 4.064548 8.776636 +v -0.412184 4.072449 8.774937 +v -0.416597 4.079779 8.772539 +v -0.421671 4.086412 8.769486 +v -0.427317 4.092234 8.765828 +v -0.43344 4.097146 8.761629 +v -0.439934 4.101064 8.75696 +v -0.446689 4.103921 8.751902 +v -0.453588 4.105668 8.74654 +v -0.460515 4.106275 8.740966 +v -0.467349 4.105732 8.735277 +v -0.473975 4.104047 8.7295685 +v -0.480279 4.101251 8.723939 +v -0.486153 4.09739 8.718484 +v -0.491496 4.092531 8.713298 +v -0.496218 4.086757 8.70847 +v -0.500237 4.080167 8.704081 +v -0.503485 4.072873 8.700207 +v -0.505906 4.065 8.696915 +v -0.507458 4.056683 8.69426 +v -0.508115 4.048065 8.692288 +v -0.507867 4.039292 8.691033 +v -0.506716 4.030515 8.690516 +v -0.504683 4.021884 8.690746 +v -0.501802 4.013547 8.691719 +v -0.498124 4.005646 8.693419 +v -0.49371 3.998316 8.695816 +v -0.488637 3.991683 8.69887 +v -0.48299 3.985861 8.702527 +v -0.476867 3.980949 8.706727 +v -0.470373 3.977031 8.711396 +v -0.463619 3.974174 8.716454 +v -0.300642 4.001757 8.57785 +v -0.306119 4.002581 8.571455 +v -0.295223 4.00203 8.584339 +v -0.289955 4.003396 8.590812 +v -0.284928 4.005831 8.597158 +v -0.280228 4.009293 8.603268 +v -0.275935 4.013723 8.609037 +v -0.272123 4.019046 8.614368 +v -0.268857 4.025169 8.619168 +v -0.266193 4.031989 8.623356 +v -0.264176 4.039389 8.62686 +v -0.262841 4.047242 8.629619 +v -0.262212 4.055414 8.631588 +v -0.262297 4.063764 8.632731 +v -0.263097 4.072151 8.633031 +v -0.264598 4.08043 8.63248 +v -0.266773 4.08846 8.631089 +v -0.269586 4.096104 8.628882 +v -0.272988 4.10323 8.625897 +v -0.276922 4.109717 8.622183 +v -0.281319 4.115454 8.617806 +v -0.286105 4.120343 8.61284 +v -0.291198 4.124299 8.607369 +v -0.29651 4.127256 8.601488 +v -0.301952 4.129163 8.595297 +v -0.307429 4.129986 8.588902 +v -0.312848 4.129713 8.582413 +v -0.318116 4.128347 8.57594 +v -0.323143 4.125912 8.569594 +v -0.327843 4.12245 8.563484 +v -0.332136 4.11802 8.557715 +v -0.335948 4.112697 8.552384 +v -0.339214 4.106574 8.547584 +v -0.341878 4.099754 8.543396 +v -0.343895 4.092354 8.539892 +v -0.34523 4.084501 8.537133 +v -0.345859 4.076329 8.535164 +v -0.345774 4.067979 8.534021 +v -0.344974 4.059592 8.533722 +v -0.343473 4.051313 8.534272 +v -0.341298 4.043283 8.535663 +v -0.338485 4.035639 8.53787 +v -0.335083 4.028513 8.540856 +v -0.331149 4.022026 8.544569 +v -0.326752 4.016289 8.548946 +v -0.321966 4.0114 8.553912 +v -0.316873 4.007444 8.559383 +v -0.311561 4.004487 8.565264 +v -0.119918 4.025284 8.449601 +v -0.124086 4.026261 8.442746 +v -0.115779 4.025358 8.456542 +v -0.11174 4.026481 8.4634495 +v -0.107872 4.028633 8.470205 +v -0.104238 4.031779 8.476694 +v -0.100903 4.035863 8.482805 +v -0.097922 4.040817 8.488433 +v -0.095348 4.046555 8.493482 +v -0.093223 4.052979 8.497867 +v -0.091585 4.05998 8.501511 +v -0.090461 4.067437 8.504352 +v -0.08987 4.075224 8.506342 +v -0.089824 4.083206 8.507447 +v -0.090321 4.091247 8.507648 +v -0.091355 4.09921 8.506941 +v -0.092907 4.106958 8.505338 +v -0.09495 4.114359 8.502868 +v -0.097451 4.121286 8.499571 +v -0.100365 4.12762 8.495506 +v -0.103644 4.133254 8.49074 +v -0.10723 4.138091 8.485356 +v -0.111063 4.142047 8.479446 +v -0.115077 4.145056 8.47311 +v -0.119204 4.147066 8.466458 +v -0.123372 4.148043 8.459603 +v -0.127511 4.147969 8.452663 +v -0.131549 4.146846 8.445756 +v -0.135418 4.144694 8.439 +v -0.139052 4.141548 8.432511 +v -0.142387 4.137464 8.4264 +v -0.145368 4.13251 8.420771 +v -0.147942 4.126772 8.415722 +v -0.150067 4.120348 8.411338 +v -0.151705 4.113347 8.407694 +v -0.152829 4.105889 8.404852 +v -0.15342 4.098103 8.402862 +v -0.153466 4.090121 8.401757 +v -0.152969 4.08208 8.401557 +v -0.151935 4.074117 8.402263 +v -0.150383 4.066369 8.403866 +v -0.14834 4.058968 8.406337 +v -0.145839 4.052041 8.409633 +v -0.142925 4.045707 8.413699 +v -0.139646 4.040073 8.418465 +v -0.13606 4.035236 8.423849 +v -0.132227 4.03128 8.429759 +v -0.128212 4.02827 8.436094 +v 0.087804 4.042051 8.345351 +v 0.084821 4.043127 8.338247 +v 0.090779 4.041986 8.352538 +v 0.093697 4.042935 8.359684 +v 0.096508 4.044879 8.366668 +v 0.099162 4.047787 8.373371 +v 0.101616 4.051609 8.379676 +v 0.103826 4.056278 8.385478 +v 0.105755 4.061716 8.390675 +v 0.10737 4.067829 8.39518 +v 0.108644 4.074512 8.398915 +v 0.109554 4.081652 8.401817 +v 0.110086 4.089125 8.403835 +v 0.110229 4.096805 8.404935 +v 0.109982 4.104559 8.405099 +v 0.109348 4.112256 8.404323 +v 0.108339 4.119763 8.402621 +v 0.106972 4.126952 8.400022 +v 0.10527 4.1337 8.39657 +v 0.103263 4.139891 8.392325 +v 0.100984 4.14542 8.387359 +v 0.098472 4.150192 8.381757 +v 0.095772 4.154125 8.375615 +v 0.092928 4.157152 8.369038 +v 0.08999 4.159221 8.362139 +v 0.087007 4.160298 8.355035 +v 0.084031 4.160362 8.347848 +v 0.081113 4.159414 8.340702 +v 0.078303 4.157469 8.333717 +v 0.075649 4.154561 8.327015 +v 0.073195 4.15074 8.320709 +v 0.070985 4.14607 8.314908 +v 0.069056 4.140633 8.309711 +v 0.06744 4.13452 8.305206 +v 0.066167 4.127836 8.301471 +v 0.065256 4.120697 8.298569 +v 0.064725 4.113223 8.296551 +v 0.064582 4.105543 8.295451 +v 0.064829 4.097789 8.295287 +v 0.065462 4.090092 8.296063 +v 0.066471 4.082585 8.297765 +v 0.067839 4.075396 8.300364 +v 0.06954 4.068649 8.303815 +v 0.071548 4.062457 8.308061 +v 0.073827 4.056928 8.313027 +v 0.076338 4.052157 8.318629 +v 0.079039 4.048223 8.324771 +v 0.081883 4.045196 8.331348 +v 0.320043 4.051523 8.267502 +v 0.318144 4.052653 8.260276 +v 0.321952 4.051376 8.274811 +v 0.323841 4.052214 8.282077 +v 0.325676 4.054022 8.289176 +v 0.327426 4.056771 8.295988 +v 0.329061 4.060412 8.302395 +v 0.330553 4.064884 8.308287 +v 0.331877 4.07011 8.313564 +v 0.333009 4.076 8.318136 +v 0.333931 4.082454 8.321925 +v 0.334627 4.089362 8.324865 +v 0.335085 4.096604 8.326906 +v 0.335297 4.104058 8.328013 +v 0.335259 4.111596 8.328168 +v 0.334972 4.119088 8.327368 +v 0.334442 4.126407 8.325626 +v 0.333676 4.133427 8.322972 +v 0.332688 4.140028 8.319452 +v 0.331496 4.146098 8.315125 +v 0.330119 4.151532 8.310067 +v 0.328581 4.156237 8.304363 +v 0.326908 4.160134 8.298111 +v 0.325129 4.163154 8.291418 +v 0.323274 4.165247 8.284399 +v 0.321376 4.166377 8.277173 +v 0.319466 4.166524 8.269865 +v 0.317578 4.165686 8.262598 +v 0.315743 4.163878 8.255499 +v 0.313993 4.161129 8.248687 +v 0.312358 4.157488 8.242281 +v 0.310866 4.153016 8.236388 +v 0.309542 4.14779 8.231111 +v 0.30841 4.1419 8.226539 +v 0.307488 4.135446 8.22275 +v 0.306792 4.128538 8.219811 +v 0.306334 4.121296 8.217769 +v 0.306122 4.113842 8.216662 +v 0.30616 4.106304 8.216507 +v 0.306446 4.098812 8.217308 +v 0.306977 4.091493 8.21905 +v 0.307743 4.084473 8.221703 +v 0.308731 4.077872 8.225224 +v 0.309923 4.071802 8.22955 +v 0.3113 4.066368 8.234608 +v 0.312838 4.061663 8.240312 +v 0.314511 4.057766 8.246564 +v 0.31629 4.054746 8.253257 +v 0.576544 4.052986 8.218156 +v 0.575632 4.054134 8.210886 +v 0.577482 4.052801 8.22551 +v 0.578432 4.053584 8.232822 +v 0.579375 4.055321 8.239967 +v 0.580297 4.057983 8.246823 +v 0.581182 4.061523 8.253272 +v 0.582014 4.065881 8.259205 +v 0.582779 4.070983 8.264519 +v 0.583464 4.076741 8.269124 +v 0.584058 4.083056 8.272941 +v 0.58455 4.089822 8.275904 +v 0.584932 4.096921 8.277963 +v 0.585197 4.104233 8.279083 +v 0.585341 4.111632 8.279244 +v 0.585361 4.118992 8.278445 +v 0.585257 4.126186 8.276697 +v 0.58503 4.133093 8.274032 +v 0.584686 4.139593 8.270495 +v 0.584229 4.145575 8.266146 +v 0.583667 4.150937 8.26106 +v 0.58301 4.155588 8.255324 +v 0.582269 4.159447 8.249036 +v 0.581457 4.162449 8.242304 +v 0.580588 4.164542 8.235242 +v 0.579676 4.16569 8.227972 +v 0.578738 4.165875 8.220618 +v 0.577789 4.165091 8.213306 +v 0.576845 4.163354 8.206161 +v 0.575923 4.160693 8.199305 +v 0.575039 4.157153 8.192855 +v 0.574207 4.152795 8.186923 +v 0.573442 4.147693 8.181609 +v 0.572756 4.141935 8.177004 +v 0.572163 4.13562 8.173187 +v 0.571671 4.128854 8.170224 +v 0.571289 4.121755 8.168165 +v 0.571024 4.114443 8.167045 +v 0.57088 4.107044 8.1668825 +v 0.57086 4.099684 8.167683 +v 0.570964 4.092489 8.169431 +v 0.57119 4.085583 8.172096 +v 0.571535 4.079083 8.175633 +v 0.571992 4.073101 8.179982 +v 0.572554 4.067738 8.185068 +v 0.573211 4.063088 8.190804 +v 0.573951 4.059229 8.197092 +v 0.574763 4.056227 8.203824 +v 0.806299 4.046904 8.202943 +v 0.809128 4.04796 8.195466 +v 0.803504 4.046807 8.210507 +v 0.800734 4.047672 8.21803 +v 0.797981 4.049487 8.225389 +v 0.795236 4.052222 8.23246 +v 0.79249 4.055832 8.239127 +v 0.789733 4.060257 8.245279 +v 0.786958 4.065423 8.250814 +v 0.786337 4.071182 8.255495 +v 0.790043 4.077377 8.259095 +v 0.793706 4.084018 8.261842 +v 0.797319 4.09099 8.263687 +v 0.800877 4.098172 8.264593 +v 0.804375 4.10544 8.264541 +v 0.807808 4.112667 8.26353 +v 0.811174 4.11973 8.261572 +v 0.814472 4.126504 8.258699 +v 0.817701 4.132874 8.254954 +v 0.820861 4.138728 8.250399 +v 0.823956 4.143965 8.245108 +v 0.826987 4.148494 8.239169 +v 0.829959 4.152236 8.232678 +v 0.832876 4.155126 8.225744 +v 0.835747 4.157113 8.218481 +v 0.838576 4.158161 8.21101 +v 0.841371 4.158251 8.203455 +v 0.844142 4.15738 8.195941 +v 0.846895 4.155561 8.188594 +v 0.849641 4.152825 8.181536 +v 0.852388 4.149217 8.174882 +v 0.855146 4.144796 8.168744 +v 0.857922 4.139638 8.163222 +v 0.858544 4.13389 8.158549 +v 0.854838 4.127709 8.1549425 +v 0.851175 4.121081 8.152187 +v 0.847561 4.11412 8.150333 +v 0.844003 4.106946 8.149417 +v 0.840505 4.099683 8.149457 +v 0.837071 4.092459 8.150457 +v 0.833704 4.085397 8.152404 +v 0.830405 4.07862 8.155268 +v 0.827176 4.072247 8.159004 +v 0.824015 4.066387 8.163552 +v 0.82092 4.061142 8.168837 +v 0.817888 4.056605 8.174774 +v 0.814916 4.052854 8.181264 +v 0.811998 4.049955 8.1882 +v -0.701895 -3.99856 9.10068 +v -0.690193 -4.00532 9.066791 +v -0.690692 -4.005032 9.068234 +v -0.699097 -4.003656 9.102234 +v -0.685025 -4.008306 9.051823 +v -0.69603 -4.008321 9.103656 +v -0.67984 -4.011301 9.036808 +v -0.672973 -4.015268 9.016918 +v -0.691976 -4.013487 9.105231 +v -0.666083 -4.019249 8.996964 +v -0.687915 -4.017838 9.106558 +v -0.686028 -4.019638 9.107107 +v -0.662878 -4.0211 8.987684 +v -0.652225 -4.027254 8.956833 +v -0.679762 -4.024811 9.108684 +v -0.6619085 -4.028527 9.025613 +v -0.673715 -4.028842 9.109913 +v -0.641932 -4.0332 8.927023 +v -0.65374 -4.033324 9.011264 +v -0.667674 -4.032107 9.110909 +v -0.631639 -4.039146 8.897213 +v -0.6476033 -4.036722 9.000419 +v -0.664638 -4.033496 9.111332 +v -0.626462 -4.042137 8.882221 +v -0.658622 -4.035811 9.112038 +v -0.618782 -4.044196 8.871021 +v -0.640656 -4.040652 9.113514 +v -0.618377 -4.044305 8.870431 +v -0.658305 -4.035926 9.112073 +v -0.595824 -4.050351 8.837542 +v -0.617412 -4.046266 9.115226 +v -0.566116 -4.058316 8.79422 +v -0.502492 -4.075375 8.701437 +v -0.567667 -4.053754 9.117509 +v -0.563485 -4.054314 9.11768 +v -0.498028 -4.076114 8.697104 +v -0.498017 -4.059205 9.119171 +v -0.428122 -4.087686 8.629239 +v -0.416516 -4.06123 9.119789 +v -0.34106 -4.102098 8.544719 +v -0.40729 -4.061364 9.119829 +v -0.332269 -4.103036 8.538664 +v -0.215474 -4.054602 9.117767 +v -0.149411 -4.122559 8.41272 +v -0.201741 -4.053954 9.11757 +v -0.137334 -4.12334 8.406825 +v 0.000713 -4.037531 9.112562 +v 0.040747 -4.134866 8.3199 +v 0.031631 -4.035022 9.111798 +v 0.067942 -4.136626 8.306625 +v 0.256671 -4.016767 9.106232 +v 0.255238 -4.142308 8.24546 +v 0.320984 -4.01155 9.104641 +v 0.308765 -4.143931 8.227979 +v 0.512628 -3.996003 9.099901 +v 0.463357 -4.143926 8.199002 +v 0.648518 -3.98498 9.096539 +v 0.572975 -4.143922 8.178455 +v 0.853905 -3.968318 9.091459 +v 0.735106 -4.139348 8.167983 +v 0.939224 -3.961397 9.089349 +v 0.802456 -4.137448 8.163632 +v 0.859788 -4.135831 8.159929 +v -0.77914 -3.84026 9.531516 +v -0.782678 -3.834772 9.528066 +v -0.7756 -3.845026 9.5345125 +v -0.770928 -3.849773 9.5374975 +v -0.766244 -3.854261 9.540319 +v -0.764068 -3.856197 9.541536 +v -0.756855 -3.86057 9.544285 +v -0.749891 -3.864407 9.546697 +v -0.742928 -3.868107 9.549024 +v -0.735967 -3.871607 9.551224 +v -0.661638 -4.034718 9.111705 +v -0.732121 -3.87348 9.552402 +v -0.711779 -3.880366 9.556731 +v -0.684987 -3.888981 9.562147 +v -0.622872 -3.901321 9.569905 +v -0.547501 -3.908942 9.574697 +v -0.443086 -3.912634 9.577017 +v -0.222406 -3.904747 9.572059 +v -0.206607 -3.904051 9.571621 +v 0.026273 -3.884897 9.559579 +v 0.320698 -3.860682 9.544356 +v 0.615122 -3.836467 9.529132 +v 0.768586 -3.97524 9.09357 +v 0.909547 -3.812252 9.513908 +v 1.090087 -3.797404 9.504573 +v -0.855374 -3.525409 9.86807 +v -0.85157 -3.530104 9.87348 +v -0.847758 -3.534619 9.878681 +v -0.842737 -3.538972 9.883696 +v -0.837701 -3.543224 9.888595 +v -0.835361 -3.545098 9.890755 +v -0.827626 -3.54873 9.894938 +v -0.820152 -3.552238 9.89898 +v -0.812678 -3.555747 9.903023 +v -0.805206 -3.559118 9.906907 +v -0.801079 -3.560939 9.909005 +v -0.77926 -3.567468 9.916526 +v -0.750525 -3.575755 9.926075 +v -0.683936 -3.587592 9.9397135 +v -0.60317 -3.594942 9.94818 +v -0.491308 -3.598637 9.952437 +v -0.25496 -3.591404 9.944103 +v -0.238038 -3.5908 9.943408 +v 0.011337 -3.573233 9.923169 +v 0.326617 -3.551024 9.897582 +v 0.641896 -3.528815 9.871995 +v 0.957175 -3.506606 9.846407 +v 1.167362 -3.4918 9.8293495 +v 1.187564 -3.490377 9.82771 +v -0.919903 -3.158167 10.126996 +v -0.855808 -3.524824 9.867396 +v -0.920468 -3.157458 10.126088 +v -0.915867 -3.163192 10.133428 +v -0.911821 -3.168126 10.139743 +v -0.906499 -3.172841 10.145779 +v -0.901162 -3.177483 10.151719 +v -0.898681 -3.179561 10.15438 +v -0.890496 -3.183494 10.159414 +v -0.882587 -3.187294 10.164278 +v -0.874678 -3.191094 10.169142 +v -0.866771 -3.194788 10.173869 +v -0.862403 -3.196796 10.17644 +v -0.839331 -3.203865 10.185487 +v -0.808943 -3.212934 10.197094 +v -0.738559 -3.225859 10.213638 +v -0.65322 -3.233911 10.223944 +v -0.535052 -3.238057 10.229252 +v -0.285446 -3.2303 10.219322 +v -0.267574 -3.229679 10.218528 +v -0.00425 -3.210841 10.194416 +v 0.328665 -3.187023 10.163931 +v 0.661579 -3.163206 10.133446 +v 0.994494 -3.139389 10.102962 +v 1.216437 -3.123511 10.082638 +v -0.97841 -2.817996 10.422821 +v -0.976293 -2.82051 10.426628 +v -0.972057 -2.825539 10.434243 +v -0.967809 -2.830509 10.441767 +v -0.96223 -2.835227 10.448912 +v -0.956635 -2.839898 10.455984 +v -0.954034 -2.842015 10.459189 +v -0.945466 -2.845949 10.465147 +v -0.937187 -2.849751 10.470903 +v -0.928908 -2.853553 10.47666 +v -0.920631 -2.85728 10.482303 +v -0.916059 -2.859317 10.485386 +v -0.891922 -2.866387 10.496092 +v -0.860132 -2.87553 10.509936 +v -0.786531 -2.888541 10.529636 +v -0.69732 -2.896666 10.541938 +v -0.573818 -2.900923 10.548383 +v -0.313009 -2.893206 10.5367 +v -0.294335 -2.892609 10.535795 +v -0.019231 -2.873871 10.507423 +v 0.328577 -2.850181 10.471553 +v 0.676385 -2.826491 10.435683 +v 1.024193 -2.802801 10.399813 +v 1.256065 -2.787007 10.3759 +v 1.325016 -2.782311 10.368789 +v -1.02677 -2.405729 10.623359 +v -1.024567 -2.40742 10.62804 +v -1.020162 -2.410802 10.637403 +v -1.015744 -2.414161 10.646698 +v -1.009948 -2.417334 10.655482 +v -1.004135 -2.420489 10.664215 +v -1.001432 -2.421931 10.668206 +v -0.992543 -2.424577 10.6755295 +v -0.983953 -2.427134 10.682606 +v -0.975363 -2.42969 10.689682 +v -0.966775 -2.432213 10.696664 +v -0.962031 -2.433596 10.700492 +v -0.904035 -2.444533 10.730767 +v -0.82774 -2.453322 10.755093 +v -0.735291 -2.458821 10.770312 +v -0.607327 -2.461738 10.778387 +v -0.33716 -2.456564 10.764066 +v -0.317816 -2.456173 10.762984 +v -0.032876 -2.443608 10.728206 +v 0.327368 -2.427723 10.6842375 +v 0.687612 -2.411838 10.640269 +v 1.047856 -2.395952 10.5963 +v 1.288018 -2.385362 10.566988 +v 1.359524 -2.382209 10.55826 +v -1.064755 -1.974106 10.739314 +v -1.067028 -1.97233 10.73429 +v -1.06021 -1.977658 10.749361 +v -1.055651 -1.981198 10.759375 +v -1.049676 -1.98453 10.768802 +v -1.043683 -1.987854 10.778205 +v -1.040897 -1.989383 10.782529 +v -1.031743 -1.992161 10.790388 +v -1.022898 -1.994846 10.797981 +v -1.014053 -1.99753 10.805574 +v -1.005209 -2.000191 10.813103 +v -1.000323 -2.001655 10.817242 +v -0.94063 -2.013167 10.849807 +v -0.862127 -2.022427 10.876001 +v -0.767026 -2.028229 10.892411 +v -0.635414 -2.031336 10.901201 +v -0.357596 -2.025914 10.885863 +v -0.337704 -2.025512 10.884727 +v -0.044726 -2.012345 10.847483 +v 0.32568 -1.9957 10.800397 +v 0.696085 -1.979054 10.75331 +v 1.066491 -1.962408 10.706224 +v 1.313428 -1.951311 10.674833 +v -1.096879 -1.567236 10.929441 +v -1.099208 -1.565523 10.924096 +v -1.092222 -1.570662 10.940132 +v -1.08755 -1.574086 10.950817 +v -1.081434 -1.5773 10.960848 +v -1.075298 -1.580514 10.970877 +v -1.072445 -1.581999 10.975511 +v -1.063081 -1.584679 10.983872 +v -1.054034 -1.587268 10.991951 +v -1.044987 -1.589857 11.0000305 +v -1.03594 -1.592433 11.008069 +v -1.030942 -1.593852 11.012498 +v -0.969906 -1.604976 11.047208 +v -0.88966 -1.61393 11.07515 +v -0.792465 -1.619545 11.092671 +v -0.657972 -1.622573 11.102121 +v -0.374121 -1.617351 11.085825 +v -0.353797 -1.61697 11.084635 +v -0.054482 -1.604289 11.045066 +v 0.323934 -1.588258 10.99504 +v 0.702351 -1.572226 10.945014 +v 1.080768 -1.556194 10.894988 +v 1.333046 -1.545507 10.861637 +v 1.413727 -1.542089 10.850971 +v -1.123326 -1.114308 11.010704 +v -1.125696 -1.113851 11.004894 +v -1.118585 -1.115223 11.022324 +v -1.094551 -1.568949 10.934787 +v -1.113844 -1.116137 11.03394 +v -1.089893 -1.572373 10.945471 +v -1.111459 -1.116596 11.03977 +v -1.105236 -1.117454 11.050673 +v -1.098994 -1.118313 11.061591 +v -1.096091 -1.118711 11.066654 +v -1.086571 -1.119426 11.075741 +v -1.077374 -1.120117 11.084521 +v -1.068176 -1.120808 11.093302 +v -1.058978 -1.121498 11.102061 +v -1.053897 -1.121878 11.1068945 +v -0.991862 -1.12485 11.144665 +v -0.910319 -1.127244 11.175088 +v -0.811568 -1.128747 11.1941805 +v -0.674937 -1.129561 11.204525 +v -0.386608 -1.128168 11.186829 +v -0.365963 -1.128068 11.185549 +v -0.061946 -1.124686 11.142577 +v 0.322416 -1.120411 11.088248 +v 0.706777 -1.116135 11.03392 +v 1.091138 -1.11186 10.979592 +v 1.347379 -1.10901 10.943373 +v 1.429188 -1.1081 10.931809 +v -1.139396 -0.667346 10.998285 +v -1.141794 -0.666879 10.992333 +v -1.134599 -0.668279 11.010189 +v -1.129803 -0.669213 11.022093 +v -1.12739 -0.669682 11.028077 +v -1.121096 -0.670558 11.039246 +v -1.114783 -0.671436 11.050445 +v -1.111847 -0.671844 11.055648 +v -1.102224 -0.672574 11.064957 +v -1.092927 -0.673279 11.073952 +v -1.083629 -0.673985 11.082946 +v -1.074331 -0.674689 11.091934 +v -1.069194 -0.675079 11.096898 +v -1.006497 -0.678115 11.135623 +v -0.924095 -0.680562 11.166825 +v -0.824314 -0.682098 11.186414 +v -0.686267 -0.682933 11.1970625 +v -0.394973 -0.681511 11.178936 +v -0.374116 -0.681409 11.177634 +v -0.066987 -0.677958 11.13362 +v 0.321309 -0.673595 11.077975 +v 0.709605 -0.669231 11.022329 +v 1.097901 -0.664868 10.966684 +v 1.356765 -0.661959 10.929587 +v -1.147429 -0.228713 11.081459 +v -1.149841 -0.228151 11.075443 +v -1.142604 -0.229837 11.093491 +v -1.13778 -0.23096 11.105522 +v -1.135353 -0.231526 11.111577 +v -1.129024 -0.23258 11.122865 +v -1.122676 -0.233638 11.13419 +v -1.119723 -0.23413 11.139457 +v -1.110049 -0.235008 11.148866 +v -1.100701 -0.235857 11.157956 +v -1.091354 -0.236706 11.1670475 +v -1.082006 -0.237555 11.176138 +v -1.076841 -0.238024 11.181161 +v -1.013815 -0.241681 11.220316 +v -0.930984 -0.244628 11.251869 +v -0.83069 -0.246478 11.271683 +v -0.691937 -0.247485 11.282469 +v -0.399167 -0.245775 11.264151 +v -0.378204 -0.245652 11.262839 +v -0.069525 -0.241498 11.21836 +v 0.320729 -0.236247 11.162125 +v 0.710984 -0.230995 11.10589 +v 1.101239 -0.225743 11.049656 +v 1.361409 -0.222242 11.012166 +v 1.443195 -0.221141 11.000381 +v -1.147429 0.228713 11.081459 +v -1.149841 0.228151 11.075443 +v -1.142604 0.229837 11.093491 +v -1.13778 0.23096 11.105522 +v -1.135353 0.231526 11.111577 +v -1.129024 0.23258 11.122865 +v -1.122676 0.233638 11.13419 +v -1.119723 0.23413 11.139457 +v -1.110049 0.235008 11.148866 +v -1.100701 0.235857 11.157956 +v -1.091354 0.236706 11.1670475 +v -1.082006 0.237555 11.176138 +v -1.076841 0.238024 11.181161 +v -1.013815 0.241681 11.220316 +v -0.930984 0.244628 11.251869 +v -0.83069 0.246478 11.271683 +v -0.691937 0.247485 11.282469 +v -0.399167 0.245775 11.264151 +v -0.378204 0.245652 11.262839 +v -0.069525 0.241498 11.21836 +v 0.320729 0.236247 11.162125 +v 0.710984 0.230995 11.10589 +v 1.101239 0.225743 11.049656 +v 1.361409 0.222242 11.012166 +v 1.443195 0.221141 11.000381 +v -1.139396 0.667346 10.998285 +v -1.141794 0.666879 10.992333 +v -1.134599 0.668279 11.010189 +v -1.129803 0.669213 11.022093 +v -1.12739 0.669682 11.028077 +v -1.121096 0.670558 11.039246 +v -1.114783 0.671436 11.050445 +v -1.111847 0.671844 11.055648 +v -1.102224 0.672574 11.064957 +v -1.092927 0.673279 11.073952 +v -1.083629 0.673985 11.082946 +v -1.074331 0.674689 11.091934 +v -1.069194 0.675079 11.096898 +v -1.006497 0.678115 11.135623 +v -0.924095 0.680562 11.166825 +v -0.824314 0.682098 11.186414 +v -0.686267 0.682933 11.1970625 +v -0.394973 0.681511 11.178936 +v -0.374116 0.681409 11.177634 +v -0.066987 0.677958 11.13362 +v 0.321309 0.673595 11.077975 +v 0.709605 0.669231 11.022329 +v 1.097901 0.664868 10.966684 +v 1.356765 0.661959 10.929587 +v -1.123326 1.114308 11.010704 +v -1.125696 1.113851 11.004894 +v -1.118585 1.115223 11.022324 +v -1.113844 1.116137 11.03394 +v -1.111459 1.116596 11.03977 +v -1.105236 1.117454 11.050673 +v -1.098994 1.118313 11.061591 +v -1.096091 1.118711 11.066654 +v -1.086571 1.119426 11.075741 +v -1.077374 1.120117 11.084521 +v -1.068176 1.120808 11.093302 +v -1.058978 1.121498 11.102061 +v -1.053897 1.121878 11.1068945 +v -0.991862 1.12485 11.144665 +v -0.910319 1.127244 11.175088 +v -0.811568 1.128747 11.1941805 +v -0.674937 1.129561 11.204525 +v -0.386608 1.128168 11.186829 +v -0.365963 1.128068 11.185549 +v -0.061946 1.124686 11.142577 +v 0.322416 1.120411 11.088248 +v 0.706777 1.116135 11.03392 +v 1.091138 1.11186 10.979592 +v 1.347379 1.10901 10.943373 +v 1.429188 1.1081 10.931809 +v -1.099208 1.565523 10.924096 +v -1.094551 1.568949 10.934787 +v -1.089893 1.572373 10.945471 +v -1.08755 1.574086 10.950817 +v -1.081434 1.5773 10.960848 +v -1.075298 1.580514 10.970877 +v -1.072445 1.581999 10.975511 +v -1.063081 1.584679 10.983872 +v -1.054034 1.587268 10.991951 +v -1.044987 1.589857 11.0000305 +v -1.03594 1.592433 11.008069 +v -1.030942 1.593852 11.012498 +v -0.969906 1.604976 11.047208 +v -0.88966 1.61393 11.07515 +v -0.792465 1.619545 11.092671 +v -0.657972 1.622573 11.102121 +v -0.374121 1.617351 11.085825 +v -0.353797 1.61697 11.084635 +v -0.054482 1.604289 11.045066 +v 0.323934 1.588258 10.99504 +v 0.702351 1.572226 10.945014 +v 1.080768 1.556194 10.894988 +v 1.333046 1.545507 10.861637 +v 1.413727 1.542089 10.850971 +v -1.064755 1.974106 10.739314 +v -1.067028 1.97233 10.73429 +v -1.096879 1.567236 10.929441 +v -1.06021 1.977658 10.749361 +v -1.092222 1.570662 10.940132 +v -1.055651 1.981198 10.759375 +v -1.049676 1.98453 10.768802 +v -1.043683 1.987854 10.778205 +v -1.040897 1.989383 10.782529 +v -1.031743 1.992161 10.790388 +v -1.022898 1.994846 10.797981 +v -1.014053 1.99753 10.805574 +v -1.005209 2.000191 10.813103 +v -1.000323 2.001655 10.817242 +v -0.94063 2.013167 10.849807 +v -0.862127 2.022427 10.876001 +v -0.767026 2.028229 10.892411 +v -0.635414 2.031336 10.901201 +v -0.357596 2.025914 10.885863 +v -0.337704 2.025512 10.884727 +v -0.044726 2.012345 10.847483 +v 0.32568 1.9957 10.800397 +v 0.696085 1.979054 10.75331 +v 1.066491 1.962408 10.706224 +v 1.313428 1.951311 10.674833 +v -1.024567 2.40742 10.62804 +v -1.02677 2.405729 10.623359 +v -1.020162 2.410802 10.637403 +v -1.015744 2.414161 10.646698 +v -1.009948 2.417334 10.655482 +v -1.004135 2.420489 10.664215 +v -1.001432 2.421931 10.668206 +v -0.992543 2.424577 10.6755295 +v -0.983953 2.427134 10.682606 +v -0.975363 2.42969 10.689682 +v -0.966775 2.432213 10.696664 +v -0.962031 2.433596 10.700492 +v -0.904035 2.444533 10.730767 +v -0.82774 2.453322 10.755093 +v -0.735291 2.458821 10.770312 +v -0.607327 2.461738 10.778387 +v -0.33716 2.456564 10.764066 +v -0.317816 2.456173 10.762984 +v -0.032876 2.443608 10.728206 +v 0.327368 2.427723 10.6842375 +v 0.687612 2.411838 10.640269 +v 1.047856 2.395952 10.5963 +v 1.288018 2.385362 10.566988 +v 1.359524 2.382209 10.55826 +v -0.976293 2.82051 10.426628 +v -0.97841 2.817996 10.422821 +v -0.972057 2.825539 10.434243 +v -0.967809 2.830509 10.441767 +v -0.96223 2.835227 10.448912 +v -0.956635 2.839898 10.455984 +v -0.954034 2.842015 10.459189 +v -0.945466 2.845949 10.465147 +v -0.937187 2.849751 10.470903 +v -0.928908 2.853553 10.47666 +v -0.920631 2.85728 10.482303 +v -0.916059 2.859317 10.485386 +v -0.860132 2.87553 10.509936 +v -0.786531 2.888541 10.529636 +v -0.69732 2.896666 10.541938 +v -0.573818 2.900923 10.548383 +v -0.313009 2.893206 10.5367 +v -0.294335 2.892609 10.535795 +v -0.019231 2.873871 10.507423 +v 0.328577 2.850181 10.471553 +v 0.676385 2.826491 10.435683 +v 1.024193 2.802801 10.399813 +v 1.256065 2.787007 10.3759 +v 1.325016 2.782311 10.368789 +v -0.919903 3.158167 10.126996 +v -0.920468 3.157458 10.126088 +v -0.915867 3.163192 10.133428 +v -0.911821 3.168126 10.139743 +v -0.906499 3.172841 10.145779 +v -0.901162 3.177483 10.151719 +v -0.898681 3.179561 10.15438 +v -0.890496 3.183494 10.159414 +v -0.882587 3.187294 10.164278 +v -0.874678 3.191094 10.169142 +v -0.866771 3.194788 10.173869 +v -0.862403 3.196796 10.17644 +v -0.808943 3.212934 10.197094 +v -0.738559 3.225859 10.213638 +v -0.65322 3.233911 10.223944 +v -0.535052 3.238057 10.229252 +v -0.285446 3.2303 10.219322 +v -0.267574 3.229679 10.218528 +v -0.00425 3.210841 10.194416 +v 0.328665 3.187023 10.163931 +v 0.661579 3.163206 10.133446 +v 0.994494 3.139389 10.102962 +v 1.216437 3.123511 10.082638 +v -0.855808 3.524824 9.867396 +v -0.85157 3.530104 9.87348 +v -0.855374 3.525409 9.86807 +v -0.847758 3.534619 9.878681 +v -0.842737 3.538972 9.883696 +v -0.837701 3.543224 9.888595 +v -0.835361 3.545098 9.890755 +v -0.827626 3.54873 9.894938 +v -0.820152 3.552238 9.89898 +v -0.812678 3.555747 9.903023 +v -0.805206 3.559118 9.906907 +v -0.801079 3.560939 9.909005 +v -0.77926 3.567468 9.916526 +v -0.839331 3.203865 10.185487 +v -0.750525 3.575755 9.926075 +v -0.683936 3.587592 9.9397135 +v -0.60317 3.594942 9.94818 +v -0.491308 3.598637 9.952437 +v -0.25496 3.591404 9.944103 +v -0.238038 3.5908 9.943408 +v 0.011337 3.573233 9.923169 +v 0.326617 3.551024 9.897582 +v 0.641896 3.528815 9.871995 +v 0.957175 3.506606 9.846407 +v 1.167362 3.4918 9.8293495 +v 1.187564 3.490377 9.82771 +v -0.77914 3.84026 9.531516 +v -0.782678 3.834772 9.528066 +v -0.7756 3.845026 9.5345125 +v -0.770928 3.849773 9.5374975 +v -0.766244 3.854261 9.540319 +v -0.764068 3.856197 9.541536 +v -0.756855 3.86057 9.544285 +v -0.749891 3.864407 9.546697 +v -0.742928 3.868107 9.549024 +v -0.735967 3.871607 9.551224 +v -0.732121 3.87348 9.552402 +v -0.711779 3.880366 9.556731 +v -0.684987 3.888981 9.562147 +v -0.622872 3.901321 9.569905 +v -0.547501 3.908942 9.574697 +v -0.443086 3.912634 9.577017 +v -0.222406 3.904747 9.572059 +v -0.206607 3.904051 9.571621 +v 0.026273 3.884897 9.559579 +v 0.320698 3.860682 9.544356 +v 0.615122 3.836467 9.529132 +v 0.909547 3.812252 9.513908 +v 1.090087 3.797404 9.504573 +v -0.701895 3.99856 9.10068 +v -0.699097 4.003656 9.102234 +v -0.69603 4.008321 9.103656 +v -0.691976 4.013487 9.105231 +v -0.687915 4.017838 9.106558 +v -0.686028 4.019638 9.107107 +v -0.679762 4.024811 9.108684 +v -0.673715 4.028842 9.109913 +v -0.667674 4.032107 9.110909 +v -0.661638 4.034718 9.111705 +v -0.658305 4.035926 9.112073 +v -0.640656 4.040652 9.113514 +v -0.617412 4.046266 9.115226 +v -0.563485 4.054314 9.11768 +v -0.498017 4.059205 9.119171 +v -0.40729 4.061364 9.119829 +v -0.215474 4.054602 9.117767 +v -0.201741 4.053954 9.11757 +v 0.000713 4.037531 9.112562 +v 0.256671 4.016767 9.106232 +v 0.512628 3.996003 9.099901 +v 0.768586 3.97524 9.09357 +v 0.939224 3.961397 9.089349 +v -0.690193 4.00532 9.066791 +v -0.690692 4.005032 9.068234 +v -0.685025 4.008306 9.051823 +v -0.67984 4.011301 9.036808 +v -0.672973 4.015268 9.016918 +v -0.666083 4.019249 8.996964 +v -0.662878 4.0211 8.987684 +v -0.652225 4.027254 8.956833 +v -0.6619085 4.028527 9.025613 +v -0.641932 4.0332 8.927023 +v -0.65374 4.033324 9.011264 +v -0.631639 4.039146 8.897213 +v -0.622633 4.043164 8.876637 +v -0.618377 4.044305 8.870431 +v -0.595824 4.050351 8.837542 +v -0.566116 4.058316 8.79422 +v -0.498028 4.076114 8.697104 +v -0.428122 4.087686 8.629239 +v -0.332269 4.103036 8.538664 +v -0.149411 4.122559 8.41272 +v -0.137334 4.12334 8.406825 +v 0.040747 4.134866 8.3199 +v 0.255238 4.142308 8.24546 +v 0.463357 4.143926 8.199002 +v 0.667756 4.141248 8.172333 +v 0.802456 4.137448 8.163632 +v 0.859788 4.135831 8.159929 +v 0.842652 -4.11353 8.147958 +v 0.847372 -4.113403 8.15008 +v 0.842379 -4.112207 8.150737 +v 0.838897 -4.111231 8.145236 +v 0.838424 -4.108939 8.15005 +v 0.837113 -4.107121 8.142643 +v 0.836567 -4.104474 8.148201 +v 0.837779 -4.102302 8.140874 +v 0.837306 -4.10001 8.145688 +v 0.840715 -4.098065 8.140403 +v 0.840442 -4.096742 8.143182 +v 0.845135 -4.095546 8.1413555 +v 0.844671 -4.114348 8.145766 +v 0.842394 -4.112648 8.14144 +v 0.841151 -4.108757 8.13826 +v 0.841276 -4.103719 8.137078 +v 0.842734 -4.098883 8.138211 +v 0.847664 -4.114348 8.144999 +v 0.847579 -4.112648 8.140111 +v 0.847138 -4.108757 8.136725 +v 0.84646 -4.103719 8.135748 +v 0.845727 -4.098883 8.137444 +v 0.850489 -4.11353 8.145949 +v 0.852471 -4.111231 8.141756 +v 0.852787 -4.107121 8.138625 +v 0.851352 -4.102302 8.137394 +v 0.848552 -4.098065 8.138394 +v 0.852066 -4.112207 8.148254 +v 0.855202 -4.108939 8.145748 +v 0.85594 -4.104474 8.143234 +v 0.854083 -4.10001 8.141386 +v 0.850128 -4.096742 8.140698 +v 0.851792 -4.110883 8.151033 +v 0.854728 -4.106646 8.150561 +v 0.855394 -4.101827 8.148792 +v 0.85361 -4.097718 8.146199 +v 0.849855 -4.095418 8.143477 +v 0.849773 -4.110065 8.153224 +v 0.851232 -4.10523 8.154358 +v 0.851356 -4.100191 8.153176 +v 0.850113 -4.096301 8.149996 +v 0.847836 -4.0946 8.145669 +v 0.84678 -4.110065 8.153992 +v 0.846047 -4.10523 8.155687 +v 0.845369 -4.100191 8.154711 +v 0.844929 -4.096301 8.151325 +v 0.844843 -4.0946 8.146437 +v 0.843956 -4.110883 8.153042 +v 0.841155 -4.106646 8.154042 +v 0.83972 -4.101827 8.152811 +v 0.840036 -4.097718 8.14968 +v 0.842018 -4.095418 8.145487 +v 0.844889 -4.131388 8.156682 +v 0.849609 -4.13126 8.158804 +v 0.844616 -4.130064 8.159461 +v 0.841134 -4.129088 8.15396 +v 0.840661 -4.126796 8.158774 +v 0.83935 -4.124979 8.151368 +v 0.838804 -4.122332 8.156926 +v 0.840016 -4.12016 8.149598 +v 0.839542 -4.117867 8.154412 +v 0.842952 -4.115923 8.149127 +v 0.842679 -4.114599 8.151906 +v 0.846908 -4.132205 8.1544895 +v 0.844631 -4.130505 8.150164 +v 0.843388 -4.126614 8.146984 +v 0.843512 -4.121576 8.145802 +v 0.844971 -4.116741 8.1469345 +v 0.849901 -4.132205 8.153723 +v 0.849816 -4.130505 8.148835 +v 0.849375 -4.126614 8.145449 +v 0.848697 -4.121576 8.144473 +v 0.847964 -4.116741 8.146168 +v 0.852726 -4.131388 8.154673 +v 0.854708 -4.129088 8.15048 +v 0.855024 -4.124979 8.147349 +v 0.853589 -4.12016 8.146118 +v 0.850789 -4.115923 8.147118 +v 0.854302 -4.130064 8.156978 +v 0.857439 -4.126796 8.154472 +v 0.858177 -4.122332 8.1519575 +v 0.85632 -4.117867 8.15011 +v 0.852365 -4.114599 8.149422 +v 0.854029 -4.128741 8.159757 +v 0.856965 -4.124504 8.159285 +v 0.857631 -4.119685 8.157516 +v 0.855847 -4.115575 8.154923 +v 0.852092 -4.113276 8.152201 +v 0.85201 -4.127923 8.161949 +v 0.853469 -4.123087 8.163082 +v 0.853593 -4.118049 8.1619 +v 0.85235 -4.114158 8.15872 +v 0.850073 -4.112458 8.154393 +v 0.849017 -4.127923 8.162716 +v 0.848284 -4.123087 8.164411 +v 0.847606 -4.118049 8.163435 +v 0.847166 -4.114158 8.160049 +v 0.84708 -4.112458 8.155161 +v 0.846193 -4.128741 8.161766 +v 0.843392 -4.124504 8.162766 +v 0.841957 -4.119685 8.161535 +v 0.842273 -4.115575 8.158404 +v 0.844255 -4.113276 8.154211 +v 0.850489 4.11353 8.145949 +v 0.847372 4.113403 8.15008 +v 0.852066 4.112207 8.148254 +v 0.855202 4.108939 8.145748 +v 0.852471 4.111231 8.141756 +v 0.852787 4.107121 8.138625 +v 0.85594 4.104474 8.143234 +v 0.851352 4.102302 8.137394 +v 0.854083 4.10001 8.141386 +v 0.848552 4.098065 8.138394 +v 0.850128 4.096742 8.140698 +v 0.845135 4.095546 8.1413555 +v 0.847664 4.114348 8.144999 +v 0.847579 4.112648 8.140111 +v 0.847138 4.108757 8.136725 +v 0.84646 4.103719 8.135748 +v 0.845727 4.098883 8.137444 +v 0.844671 4.114348 8.145766 +v 0.842394 4.112648 8.14144 +v 0.841151 4.108757 8.13826 +v 0.841276 4.103719 8.137078 +v 0.842734 4.098883 8.138211 +v 0.842652 4.11353 8.147958 +v 0.838897 4.111231 8.145236 +v 0.837113 4.107121 8.142643 +v 0.837779 4.102302 8.140874 +v 0.840715 4.098065 8.140403 +v 0.842379 4.112207 8.150737 +v 0.838424 4.108939 8.15005 +v 0.836567 4.104474 8.148201 +v 0.837306 4.10001 8.145688 +v 0.840442 4.096742 8.143182 +v 0.843956 4.110883 8.153042 +v 0.841155 4.106646 8.154042 +v 0.83972 4.101827 8.152811 +v 0.840036 4.097718 8.14968 +v 0.842018 4.095418 8.145487 +v 0.84678 4.110065 8.153992 +v 0.846047 4.10523 8.155687 +v 0.845369 4.100191 8.154711 +v 0.844929 4.096301 8.151325 +v 0.844843 4.0946 8.146437 +v 0.849773 4.110065 8.153224 +v 0.851232 4.10523 8.154358 +v 0.851356 4.100191 8.153176 +v 0.850113 4.096301 8.149996 +v 0.847836 4.0946 8.145669 +v 0.851792 4.110883 8.151033 +v 0.854728 4.106646 8.150561 +v 0.855394 4.101827 8.148792 +v 0.85361 4.097718 8.146199 +v 0.849855 4.095418 8.143477 +v 0.852726 4.131388 8.154673 +v 0.849609 4.13126 8.158804 +v 0.854302 4.130064 8.156978 +v 0.857439 4.126796 8.154472 +v 0.854708 4.129088 8.15048 +v 0.855024 4.124979 8.147349 +v 0.858177 4.122332 8.1519575 +v 0.853589 4.12016 8.146118 +v 0.85632 4.117867 8.15011 +v 0.850789 4.115923 8.147118 +v 0.852365 4.114599 8.149422 +v 0.849901 4.132205 8.153723 +v 0.849816 4.130505 8.148835 +v 0.849375 4.126614 8.145449 +v 0.848697 4.121576 8.144473 +v 0.847964 4.116741 8.146168 +v 0.846908 4.132205 8.1544895 +v 0.844631 4.130505 8.150164 +v 0.843388 4.126614 8.146984 +v 0.843512 4.121576 8.145802 +v 0.844971 4.116741 8.1469345 +v 0.844889 4.131388 8.156682 +v 0.841134 4.129088 8.15396 +v 0.83935 4.124979 8.151368 +v 0.840016 4.12016 8.149598 +v 0.842952 4.115923 8.149127 +v 0.844616 4.130064 8.159461 +v 0.840661 4.126796 8.158774 +v 0.838804 4.122332 8.156926 +v 0.839542 4.117867 8.154412 +v 0.842679 4.114599 8.151906 +v 0.846193 4.128741 8.161766 +v 0.843392 4.124504 8.162766 +v 0.841957 4.119685 8.161535 +v 0.842273 4.115575 8.158404 +v 0.844255 4.113276 8.154211 +v 0.849017 4.127923 8.162716 +v 0.848284 4.123087 8.164411 +v 0.847606 4.118049 8.163435 +v 0.847166 4.114158 8.160049 +v 0.84708 4.112458 8.155161 +v 0.85201 4.127923 8.161949 +v 0.853469 4.123087 8.163082 +v 0.853593 4.118049 8.1619 +v 0.85235 4.114158 8.15872 +v 0.850073 4.112458 8.154393 +v 0.854029 4.128741 8.159757 +v 0.856965 4.124504 8.159285 +v 0.857631 4.119685 8.157516 +v 0.855847 4.115575 8.154923 +v 0.852092 4.113276 8.152201 +f 1 2 3 +f 1 4 2 +f 5 3 6 +f 5 1 3 +f 7 6 8 +f 7 5 6 +f 9 8 10 +f 9 7 8 +f 11 10 12 +f 11 9 10 +f 11 12 13 +f 14 11 13 +f 14 13 15 +f 16 14 15 +f 17 15 18 +f 17 16 15 +f 19 18 20 +f 19 17 18 +f 21 20 22 +f 21 19 20 +f 23 22 24 +f 23 21 22 +f 25 24 26 +f 25 23 24 +f 27 26 28 +f 27 25 26 +f 29 28 30 +f 29 27 28 +f 31 30 32 +f 31 29 30 +f 33 32 34 +f 33 31 32 +f 35 34 36 +f 35 33 34 +f 37 36 38 +f 37 35 36 +f 39 38 40 +f 39 37 38 +f 41 40 42 +f 41 39 40 +f 43 42 44 +f 43 41 42 +f 45 44 46 +f 45 43 44 +f 47 46 48 +f 47 45 46 +f 49 48 50 +f 49 47 48 +f 49 50 51 +f 52 49 51 +f 53 51 54 +f 53 52 51 +f 55 54 56 +f 55 53 54 +f 57 56 58 +f 57 55 56 +f 59 58 60 +f 59 57 58 +f 59 60 61 +f 62 59 61 +f 62 61 63 +f 64 62 63 +f 65 63 66 +f 65 64 63 +f 67 66 68 +f 67 65 66 +f 69 68 70 +f 69 67 68 +f 71 70 72 +f 71 69 70 +f 73 72 74 +f 73 71 72 +f 75 74 76 +f 75 73 74 +f 77 76 78 +f 77 75 76 +f 79 78 80 +f 79 77 78 +f 81 80 82 +f 81 79 80 +f 83 82 84 +f 83 81 82 +f 85 84 86 +f 85 83 84 +f 87 86 88 +f 87 85 86 +f 89 88 90 +f 89 87 88 +f 91 90 92 +f 91 89 90 +f 93 92 94 +f 93 91 92 +f 95 94 96 +f 95 93 94 +f 4 96 2 +f 4 95 96 +f 97 4 1 +f 97 98 4 +f 99 1 5 +f 99 97 1 +f 100 5 7 +f 100 99 5 +f 101 7 9 +f 101 100 7 +f 102 9 11 +f 102 101 9 +f 103 11 14 +f 103 102 11 +f 104 14 16 +f 104 103 14 +f 105 16 17 +f 105 104 16 +f 106 17 19 +f 106 105 17 +f 107 19 21 +f 107 106 19 +f 107 21 23 +f 108 107 23 +f 109 23 25 +f 109 108 23 +f 110 25 27 +f 110 109 25 +f 111 27 29 +f 111 110 27 +f 112 29 31 +f 112 111 29 +f 113 31 33 +f 113 112 31 +f 113 33 35 +f 114 113 35 +f 115 35 37 +f 115 114 35 +f 116 37 39 +f 116 115 37 +f 117 39 41 +f 117 116 39 +f 118 41 43 +f 118 117 41 +f 119 43 45 +f 119 118 43 +f 120 45 47 +f 120 119 45 +f 121 47 49 +f 121 120 47 +f 121 49 52 +f 122 121 52 +f 123 52 53 +f 123 122 52 +f 124 53 55 +f 124 123 53 +f 124 55 57 +f 125 124 57 +f 126 57 59 +f 126 125 57 +f 127 59 62 +f 127 126 59 +f 128 62 64 +f 128 127 62 +f 129 64 65 +f 129 128 64 +f 130 65 67 +f 130 129 65 +f 131 67 69 +f 131 130 67 +f 132 69 71 +f 132 131 69 +f 133 71 73 +f 133 132 71 +f 134 73 75 +f 134 133 73 +f 135 75 77 +f 135 134 75 +f 136 77 79 +f 136 135 77 +f 137 79 81 +f 137 136 79 +f 138 81 83 +f 138 137 81 +f 139 83 85 +f 139 138 83 +f 140 85 87 +f 140 139 85 +f 140 87 89 +f 141 140 89 +f 142 89 91 +f 142 141 89 +f 143 91 93 +f 143 142 91 +f 144 93 95 +f 144 143 93 +f 98 95 4 +f 98 144 95 +f 145 98 97 +f 145 146 98 +f 147 97 99 +f 147 145 97 +f 148 99 100 +f 148 147 99 +f 149 100 101 +f 149 148 100 +f 150 101 102 +f 150 149 101 +f 151 102 103 +f 151 150 102 +f 152 103 104 +f 152 151 103 +f 153 104 105 +f 153 152 104 +f 154 105 106 +f 154 153 105 +f 155 106 107 +f 155 154 106 +f 156 107 108 +f 156 155 107 +f 157 108 109 +f 157 156 108 +f 157 109 110 +f 158 157 110 +f 158 110 111 +f 159 158 111 +f 160 111 112 +f 160 159 111 +f 161 112 113 +f 161 160 112 +f 162 113 114 +f 162 161 113 +f 163 114 115 +f 163 162 114 +f 164 115 116 +f 164 163 115 +f 165 116 117 +f 165 164 116 +f 166 117 118 +f 166 165 117 +f 167 118 119 +f 167 166 118 +f 168 119 120 +f 168 167 119 +f 169 120 121 +f 169 168 120 +f 170 121 122 +f 170 169 121 +f 170 122 123 +f 171 170 123 +f 172 123 124 +f 172 171 123 +f 173 124 125 +f 173 172 124 +f 174 125 126 +f 174 173 125 +f 175 126 127 +f 175 174 126 +f 176 127 128 +f 176 175 127 +f 177 128 129 +f 177 176 128 +f 178 129 130 +f 178 177 129 +f 179 130 131 +f 179 178 130 +f 180 131 132 +f 180 179 131 +f 180 132 133 +f 181 180 133 +f 182 133 134 +f 182 181 133 +f 183 134 135 +f 183 182 134 +f 184 135 136 +f 184 183 135 +f 185 136 137 +f 185 184 136 +f 186 137 138 +f 186 185 137 +f 187 138 139 +f 187 186 138 +f 188 139 140 +f 188 187 139 +f 188 140 141 +f 189 188 141 +f 190 141 142 +f 190 189 141 +f 191 142 143 +f 191 190 142 +f 192 143 144 +f 192 191 143 +f 146 144 98 +f 146 192 144 +f 193 146 145 +f 193 194 146 +f 195 145 147 +f 195 193 145 +f 196 147 148 +f 196 195 147 +f 197 148 149 +f 197 196 148 +f 198 149 150 +f 198 197 149 +f 199 150 151 +f 199 198 150 +f 200 151 152 +f 200 199 151 +f 201 152 153 +f 201 200 152 +f 202 153 154 +f 202 201 153 +f 202 154 155 +f 203 202 155 +f 203 155 156 +f 204 203 156 +f 205 156 157 +f 205 204 156 +f 205 157 158 +f 206 205 158 +f 207 158 159 +f 207 206 158 +f 208 159 160 +f 208 207 159 +f 209 160 161 +f 209 208 160 +f 210 161 162 +f 210 209 161 +f 211 162 163 +f 211 210 162 +f 212 163 164 +f 212 211 163 +f 213 164 165 +f 213 212 164 +f 213 165 166 +f 214 213 166 +f 215 166 167 +f 215 214 166 +f 216 167 168 +f 216 215 167 +f 217 168 169 +f 217 216 168 +f 218 169 170 +f 218 217 169 +f 219 170 171 +f 219 218 170 +f 220 171 172 +f 220 219 171 +f 221 172 173 +f 221 220 172 +f 221 173 174 +f 222 221 174 +f 223 174 175 +f 223 222 174 +f 224 175 176 +f 224 223 175 +f 224 176 177 +f 225 224 177 +f 226 177 178 +f 226 225 177 +f 227 178 179 +f 227 226 178 +f 227 179 180 +f 228 227 180 +f 229 180 181 +f 229 228 180 +f 230 181 182 +f 230 229 181 +f 231 182 183 +f 231 230 182 +f 232 183 184 +f 232 231 183 +f 232 184 185 +f 233 232 185 +f 234 185 186 +f 234 233 185 +f 234 186 187 +f 235 234 187 +f 236 187 188 +f 236 235 187 +f 237 188 189 +f 237 236 188 +f 237 189 190 +f 238 237 190 +f 239 190 191 +f 239 238 190 +f 240 191 192 +f 240 239 191 +f 194 192 146 +f 194 240 192 +f 241 194 193 +f 241 242 194 +f 243 193 195 +f 243 241 193 +f 244 195 196 +f 244 243 195 +f 245 196 197 +f 245 244 196 +f 245 197 198 +f 246 245 198 +f 247 198 199 +f 247 246 198 +f 248 199 200 +f 248 247 199 +f 249 200 201 +f 249 248 200 +f 249 201 202 +f 250 249 202 +f 251 202 203 +f 251 250 202 +f 252 203 204 +f 252 251 203 +f 253 204 205 +f 253 252 204 +f 254 205 206 +f 254 253 205 +f 255 206 207 +f 255 254 206 +f 256 207 208 +f 256 255 207 +f 256 208 209 +f 257 256 209 +f 258 209 210 +f 258 257 209 +f 258 210 211 +f 259 258 211 +f 260 211 212 +f 260 259 211 +f 261 212 213 +f 261 260 212 +f 262 213 214 +f 262 261 213 +f 262 214 215 +f 263 262 215 +f 264 215 216 +f 264 263 215 +f 265 216 217 +f 265 264 216 +f 266 217 218 +f 266 265 217 +f 266 218 219 +f 267 266 219 +f 268 219 220 +f 268 267 219 +f 268 220 221 +f 269 268 221 +f 270 221 222 +f 270 269 221 +f 271 222 223 +f 271 270 222 +f 272 223 224 +f 272 271 223 +f 273 224 225 +f 273 272 224 +f 273 225 226 +f 274 273 226 +f 275 226 227 +f 275 274 226 +f 276 227 228 +f 276 275 227 +f 277 228 229 +f 277 276 228 +f 278 229 230 +f 278 277 229 +f 279 230 231 +f 279 278 230 +f 280 231 232 +f 280 279 231 +f 281 232 233 +f 281 280 232 +f 282 233 234 +f 282 281 233 +f 283 234 235 +f 283 282 234 +f 284 235 236 +f 284 283 235 +f 284 236 237 +f 285 284 237 +f 286 237 238 +f 286 285 237 +f 287 238 239 +f 287 286 238 +f 288 239 240 +f 288 287 239 +f 242 240 194 +f 242 288 240 +f 289 242 241 +f 289 290 242 +f 289 241 243 +f 291 289 243 +f 292 243 244 +f 292 291 243 +f 293 244 245 +f 293 292 244 +f 294 245 246 +f 294 293 245 +f 295 246 247 +f 295 294 246 +f 296 247 248 +f 296 295 247 +f 296 248 249 +f 297 296 249 +f 298 249 250 +f 298 297 249 +f 299 250 251 +f 299 298 250 +f 300 251 252 +f 300 299 251 +f 301 252 253 +f 301 300 252 +f 302 253 254 +f 302 301 253 +f 303 254 255 +f 303 302 254 +f 304 255 256 +f 304 303 255 +f 305 256 257 +f 305 304 256 +f 306 257 258 +f 306 305 257 +f 306 258 259 +f 307 306 259 +f 308 259 260 +f 308 307 259 +f 309 260 261 +f 309 308 260 +f 310 261 262 +f 310 309 261 +f 310 262 263 +f 311 310 263 +f 312 263 264 +f 312 311 263 +f 313 264 265 +f 313 312 264 +f 314 265 266 +f 314 313 265 +f 315 266 267 +f 315 314 266 +f 316 267 268 +f 316 315 267 +f 317 268 269 +f 317 316 268 +f 317 269 270 +f 318 317 270 +f 319 270 271 +f 319 318 270 +f 320 271 272 +f 320 319 271 +f 321 272 273 +f 321 320 272 +f 322 273 274 +f 322 321 273 +f 323 274 275 +f 323 322 274 +f 324 275 276 +f 324 323 275 +f 325 276 277 +f 325 324 276 +f 326 277 278 +f 326 325 277 +f 327 278 279 +f 327 326 278 +f 328 279 280 +f 328 327 279 +f 329 280 281 +f 329 328 280 +f 330 281 282 +f 330 329 281 +f 331 282 283 +f 331 330 282 +f 332 283 284 +f 332 331 283 +f 333 284 285 +f 333 332 284 +f 334 285 286 +f 334 333 285 +f 335 286 287 +f 335 334 286 +f 335 287 288 +f 336 335 288 +f 290 288 242 +f 290 336 288 +f 337 290 289 +f 337 338 290 +f 339 289 291 +f 339 337 289 +f 340 291 292 +f 340 339 291 +f 341 292 293 +f 341 340 292 +f 342 293 294 +f 342 341 293 +f 343 294 295 +f 343 342 294 +f 344 295 296 +f 344 343 295 +f 345 296 297 +f 345 344 296 +f 345 297 298 +f 346 345 298 +f 347 298 299 +f 347 346 298 +f 348 299 300 +f 348 347 299 +f 349 300 301 +f 349 348 300 +f 350 301 302 +f 350 349 301 +f 351 302 303 +f 351 350 302 +f 352 303 304 +f 352 351 303 +f 353 304 305 +f 353 352 304 +f 354 305 306 +f 354 353 305 +f 355 306 307 +f 355 354 306 +f 356 307 308 +f 356 355 307 +f 357 308 309 +f 357 356 308 +f 358 309 310 +f 358 357 309 +f 359 310 311 +f 359 358 310 +f 360 311 312 +f 360 359 311 +f 361 312 313 +f 361 360 312 +f 361 313 314 +f 362 361 314 +f 363 314 315 +f 363 362 314 +f 364 315 316 +f 364 363 315 +f 365 316 317 +f 365 364 316 +f 366 317 318 +f 366 365 317 +f 366 318 319 +f 367 366 319 +f 368 319 320 +f 368 367 319 +f 369 320 321 +f 369 368 320 +f 370 321 322 +f 370 369 321 +f 371 322 323 +f 371 370 322 +f 372 323 324 +f 372 371 323 +f 373 324 325 +f 373 372 324 +f 374 325 326 +f 374 373 325 +f 375 326 327 +f 375 374 326 +f 376 327 328 +f 376 375 327 +f 377 328 329 +f 377 376 328 +f 378 329 330 +f 378 377 329 +f 379 330 331 +f 379 378 330 +f 380 331 332 +f 380 379 331 +f 380 332 333 +f 381 380 333 +f 382 333 334 +f 382 381 333 +f 383 334 335 +f 383 382 334 +f 384 335 336 +f 384 383 335 +f 338 336 290 +f 338 384 336 +f 385 338 337 +f 385 386 338 +f 387 337 339 +f 387 385 337 +f 388 339 340 +f 388 387 339 +f 389 340 341 +f 389 388 340 +f 390 341 342 +f 390 389 341 +f 391 342 343 +f 391 390 342 +f 391 343 344 +f 392 391 344 +f 393 344 345 +f 393 392 344 +f 394 345 346 +f 394 393 345 +f 395 346 347 +f 395 394 346 +f 396 347 348 +f 396 395 347 +f 397 348 349 +f 397 396 348 +f 398 349 350 +f 398 397 349 +f 399 350 351 +f 399 398 350 +f 400 351 352 +f 400 399 351 +f 401 352 353 +f 401 400 352 +f 402 353 354 +f 402 401 353 +f 403 354 355 +f 403 402 354 +f 404 355 356 +f 404 403 355 +f 405 356 357 +f 405 404 356 +f 406 357 358 +f 406 405 357 +f 407 358 359 +f 407 406 358 +f 408 359 360 +f 408 407 359 +f 409 360 361 +f 409 408 360 +f 410 361 362 +f 410 409 361 +f 411 362 363 +f 411 410 362 +f 412 363 364 +f 412 411 363 +f 413 364 365 +f 413 412 364 +f 414 365 366 +f 414 413 365 +f 415 366 367 +f 415 414 366 +f 416 367 368 +f 416 415 367 +f 417 368 369 +f 417 416 368 +f 418 369 370 +f 418 417 369 +f 419 370 371 +f 419 418 370 +f 420 371 372 +f 420 419 371 +f 421 372 373 +f 421 420 372 +f 422 373 374 +f 422 421 373 +f 423 374 375 +f 423 422 374 +f 424 375 376 +f 424 423 375 +f 425 376 377 +f 425 424 376 +f 426 377 378 +f 426 425 377 +f 427 378 379 +f 427 426 378 +f 428 379 380 +f 428 427 379 +f 429 380 381 +f 429 428 380 +f 430 381 382 +f 430 429 381 +f 430 382 383 +f 431 430 383 +f 432 383 384 +f 432 431 383 +f 386 384 338 +f 386 432 384 +f 433 386 385 +f 433 434 386 +f 435 385 387 +f 435 433 385 +f 435 387 388 +f 436 435 388 +f 437 388 389 +f 437 436 388 +f 438 389 390 +f 438 437 389 +f 439 390 391 +f 439 438 390 +f 440 391 392 +f 440 439 391 +f 441 392 393 +f 441 440 392 +f 442 393 394 +f 442 441 393 +f 443 394 395 +f 443 442 394 +f 444 395 396 +f 444 443 395 +f 445 396 397 +f 445 444 396 +f 446 397 398 +f 446 445 397 +f 447 398 399 +f 447 446 398 +f 448 399 400 +f 448 447 399 +f 449 400 401 +f 449 448 400 +f 450 401 402 +f 450 449 401 +f 451 402 403 +f 451 450 402 +f 452 403 404 +f 452 451 403 +f 453 404 405 +f 453 452 404 +f 454 405 406 +f 454 453 405 +f 455 406 407 +f 455 454 406 +f 456 407 408 +f 456 455 407 +f 457 408 409 +f 457 456 408 +f 458 409 410 +f 458 457 409 +f 459 410 411 +f 459 458 410 +f 460 411 412 +f 460 459 411 +f 461 412 413 +f 461 460 412 +f 462 413 414 +f 462 461 413 +f 463 414 415 +f 463 462 414 +f 464 415 416 +f 464 463 415 +f 465 416 417 +f 465 464 416 +f 466 417 418 +f 466 465 417 +f 467 418 419 +f 467 466 418 +f 468 419 420 +f 468 467 419 +f 469 420 421 +f 469 468 420 +f 470 421 422 +f 470 469 421 +f 471 422 423 +f 471 470 422 +f 472 423 424 +f 472 471 423 +f 473 424 425 +f 473 472 424 +f 474 425 426 +f 474 473 425 +f 475 426 427 +f 475 474 426 +f 476 427 428 +f 476 475 427 +f 477 428 429 +f 477 476 428 +f 478 429 430 +f 478 477 429 +f 479 430 431 +f 479 478 430 +f 480 431 432 +f 480 479 431 +f 434 432 386 +f 434 480 432 +f 481 434 433 +f 481 482 434 +f 483 433 435 +f 483 481 433 +f 484 435 436 +f 484 483 435 +f 485 436 437 +f 485 484 436 +f 486 437 438 +f 486 485 437 +f 487 438 439 +f 487 486 438 +f 488 439 440 +f 488 487 439 +f 489 440 441 +f 489 488 440 +f 490 441 442 +f 490 489 441 +f 491 442 443 +f 491 490 442 +f 492 443 444 +f 492 491 443 +f 493 444 445 +f 493 492 444 +f 494 445 446 +f 494 493 445 +f 495 446 447 +f 495 494 446 +f 496 447 448 +f 496 495 447 +f 497 448 449 +f 497 496 448 +f 498 449 450 +f 498 497 449 +f 499 450 451 +f 499 498 450 +f 500 451 452 +f 500 499 451 +f 501 452 453 +f 501 500 452 +f 502 453 454 +f 502 501 453 +f 503 454 455 +f 503 502 454 +f 504 455 456 +f 504 503 455 +f 505 456 457 +f 505 504 456 +f 506 457 458 +f 506 505 457 +f 507 458 459 +f 507 506 458 +f 508 459 460 +f 508 507 459 +f 509 460 461 +f 509 508 460 +f 510 461 462 +f 510 509 461 +f 511 462 463 +f 511 510 462 +f 512 463 464 +f 512 511 463 +f 513 464 465 +f 513 512 464 +f 514 465 466 +f 514 513 465 +f 515 466 467 +f 515 514 466 +f 516 467 468 +f 516 515 467 +f 517 468 469 +f 517 516 468 +f 518 469 470 +f 518 517 469 +f 519 470 471 +f 519 518 470 +f 520 471 472 +f 520 519 471 +f 521 472 473 +f 521 520 472 +f 522 473 474 +f 522 521 473 +f 523 474 475 +f 523 522 474 +f 524 475 476 +f 524 523 475 +f 525 476 477 +f 525 524 476 +f 526 477 478 +f 526 525 477 +f 527 478 479 +f 527 526 478 +f 528 479 480 +f 528 527 479 +f 482 480 434 +f 482 528 480 +f 529 482 481 +f 529 530 482 +f 531 481 483 +f 531 529 481 +f 532 483 484 +f 532 531 483 +f 533 484 485 +f 533 532 484 +f 534 485 486 +f 534 533 485 +f 535 486 487 +f 535 534 486 +f 536 487 488 +f 536 535 487 +f 537 488 489 +f 537 536 488 +f 538 489 490 +f 538 537 489 +f 539 490 491 +f 539 538 490 +f 540 491 492 +f 540 539 491 +f 541 492 493 +f 541 540 492 +f 542 493 494 +f 542 541 493 +f 543 494 495 +f 543 542 494 +f 544 495 496 +f 544 543 495 +f 545 496 497 +f 545 544 496 +f 546 497 498 +f 546 545 497 +f 547 498 499 +f 547 546 498 +f 548 499 500 +f 548 547 499 +f 549 500 501 +f 549 548 500 +f 550 501 502 +f 550 549 501 +f 551 502 503 +f 551 550 502 +f 552 503 504 +f 552 551 503 +f 553 504 505 +f 553 552 504 +f 554 505 506 +f 554 553 505 +f 555 506 507 +f 555 554 506 +f 556 507 508 +f 556 555 507 +f 557 508 509 +f 557 556 508 +f 558 509 510 +f 558 557 509 +f 559 510 511 +f 559 558 510 +f 560 511 512 +f 560 559 511 +f 561 512 513 +f 561 560 512 +f 562 513 514 +f 562 561 513 +f 563 514 515 +f 563 562 514 +f 564 515 516 +f 564 563 515 +f 565 516 517 +f 565 564 516 +f 566 517 518 +f 566 565 517 +f 567 518 519 +f 567 566 518 +f 568 519 520 +f 568 567 519 +f 569 520 521 +f 569 568 520 +f 570 521 522 +f 570 569 521 +f 571 522 523 +f 571 570 522 +f 572 523 524 +f 572 571 523 +f 573 524 525 +f 573 572 524 +f 574 525 526 +f 574 573 525 +f 575 526 527 +f 575 574 526 +f 576 527 528 +f 576 575 527 +f 530 528 482 +f 530 576 528 +f 577 530 529 +f 577 578 530 +f 579 529 531 +f 579 577 529 +f 580 531 532 +f 580 579 531 +f 581 532 533 +f 581 580 532 +f 582 533 534 +f 582 581 533 +f 583 534 535 +f 583 582 534 +f 584 535 536 +f 584 583 535 +f 585 536 537 +f 585 584 536 +f 586 537 538 +f 586 585 537 +f 587 538 539 +f 587 586 538 +f 588 539 540 +f 588 587 539 +f 589 540 541 +f 589 588 540 +f 590 541 542 +f 590 589 541 +f 591 542 543 +f 591 590 542 +f 592 543 544 +f 592 591 543 +f 593 544 545 +f 593 592 544 +f 594 545 546 +f 594 593 545 +f 595 546 547 +f 595 594 546 +f 596 547 548 +f 596 595 547 +f 597 548 549 +f 597 596 548 +f 598 549 550 +f 598 597 549 +f 599 550 551 +f 599 598 550 +f 600 551 552 +f 600 599 551 +f 601 552 553 +f 601 600 552 +f 602 553 554 +f 602 601 553 +f 603 554 555 +f 603 602 554 +f 604 555 556 +f 604 603 555 +f 605 556 557 +f 605 604 556 +f 606 557 558 +f 606 605 557 +f 607 558 559 +f 607 606 558 +f 608 559 560 +f 608 607 559 +f 609 560 561 +f 609 608 560 +f 610 561 562 +f 610 609 561 +f 611 562 563 +f 611 610 562 +f 612 563 564 +f 612 611 563 +f 613 564 565 +f 613 612 564 +f 614 565 566 +f 614 613 565 +f 615 566 567 +f 615 614 566 +f 616 567 568 +f 616 615 567 +f 617 568 569 +f 617 616 568 +f 618 569 570 +f 618 617 569 +f 619 570 571 +f 619 618 570 +f 620 571 572 +f 620 619 571 +f 621 572 573 +f 621 620 572 +f 622 573 574 +f 622 621 573 +f 623 574 575 +f 623 622 574 +f 624 575 576 +f 624 623 575 +f 578 576 530 +f 578 624 576 +f 625 578 577 +f 625 626 578 +f 627 577 579 +f 627 625 577 +f 628 579 580 +f 628 627 579 +f 629 580 581 +f 629 628 580 +f 630 581 582 +f 630 629 581 +f 631 582 583 +f 631 630 582 +f 632 583 584 +f 632 631 583 +f 633 584 585 +f 633 632 584 +f 634 585 586 +f 634 633 585 +f 635 586 587 +f 635 634 586 +f 636 587 588 +f 636 635 587 +f 637 588 589 +f 637 636 588 +f 638 589 590 +f 638 637 589 +f 639 590 591 +f 639 638 590 +f 640 591 592 +f 640 639 591 +f 641 592 593 +f 641 640 592 +f 642 593 594 +f 642 641 593 +f 643 594 595 +f 643 642 594 +f 644 595 596 +f 644 643 595 +f 645 596 597 +f 645 644 596 +f 646 597 598 +f 646 645 597 +f 647 598 599 +f 647 646 598 +f 648 599 600 +f 648 647 599 +f 649 600 601 +f 649 648 600 +f 650 601 602 +f 650 649 601 +f 651 602 603 +f 651 650 602 +f 652 603 604 +f 652 651 603 +f 653 604 605 +f 653 652 604 +f 654 605 606 +f 654 653 605 +f 655 606 607 +f 655 654 606 +f 656 607 608 +f 656 655 607 +f 657 608 609 +f 657 656 608 +f 658 609 610 +f 658 657 609 +f 659 610 611 +f 659 658 610 +f 660 611 612 +f 660 659 611 +f 661 612 613 +f 661 660 612 +f 662 613 614 +f 662 661 613 +f 663 614 615 +f 663 662 614 +f 664 615 616 +f 664 663 615 +f 665 616 617 +f 665 664 616 +f 666 617 618 +f 666 665 617 +f 667 618 619 +f 667 666 618 +f 668 619 620 +f 668 667 619 +f 668 620 621 +f 669 668 621 +f 670 621 622 +f 670 669 621 +f 671 622 623 +f 671 670 622 +f 672 623 624 +f 672 671 623 +f 626 624 578 +f 626 672 624 +f 673 626 625 +f 673 674 626 +f 675 625 627 +f 675 673 625 +f 676 627 628 +f 676 675 627 +f 677 628 629 +f 677 676 628 +f 678 629 630 +f 678 677 629 +f 679 630 631 +f 679 678 630 +f 679 631 632 +f 680 679 632 +f 681 632 633 +f 681 680 632 +f 682 633 634 +f 682 681 633 +f 683 634 635 +f 683 682 634 +f 684 635 636 +f 684 683 635 +f 685 636 637 +f 685 684 636 +f 685 637 638 +f 686 685 638 +f 687 638 639 +f 687 686 638 +f 688 639 640 +f 688 687 639 +f 689 640 641 +f 689 688 640 +f 690 641 642 +f 690 689 641 +f 691 642 643 +f 691 690 642 +f 692 643 644 +f 692 691 643 +f 693 644 645 +f 693 692 644 +f 694 645 646 +f 694 693 645 +f 695 646 647 +f 695 694 646 +f 696 647 648 +f 696 695 647 +f 697 648 649 +f 697 696 648 +f 698 649 650 +f 698 697 649 +f 699 650 651 +f 699 698 650 +f 700 651 652 +f 700 699 651 +f 701 652 653 +f 701 700 652 +f 702 653 654 +f 702 701 653 +f 703 654 655 +f 703 702 654 +f 703 655 656 +f 704 703 656 +f 705 656 657 +f 705 704 656 +f 706 657 658 +f 706 705 657 +f 707 658 659 +f 707 706 658 +f 708 659 660 +f 708 707 659 +f 709 660 661 +f 709 708 660 +f 710 661 662 +f 710 709 661 +f 711 662 663 +f 711 710 662 +f 712 663 664 +f 712 711 663 +f 713 664 665 +f 713 712 664 +f 714 665 666 +f 714 713 665 +f 715 666 667 +f 715 714 666 +f 716 667 668 +f 716 715 667 +f 717 668 669 +f 717 716 668 +f 718 669 670 +f 718 717 669 +f 719 670 671 +f 719 718 670 +f 720 671 672 +f 720 719 671 +f 674 672 626 +f 674 720 672 +f 721 674 673 +f 721 722 674 +f 723 673 675 +f 723 721 673 +f 723 675 676 +f 724 723 676 +f 725 676 677 +f 725 724 676 +f 726 677 678 +f 726 725 677 +f 727 678 679 +f 727 726 678 +f 728 679 680 +f 728 727 679 +f 729 680 681 +f 729 728 680 +f 729 681 682 +f 730 729 682 +f 731 682 683 +f 731 730 682 +f 732 683 684 +f 732 731 683 +f 733 684 685 +f 733 732 684 +f 734 685 686 +f 734 733 685 +f 735 686 687 +f 735 734 686 +f 736 687 688 +f 736 735 687 +f 737 688 689 +f 737 736 688 +f 738 689 690 +f 738 737 689 +f 739 690 691 +f 739 738 690 +f 740 691 692 +f 740 739 691 +f 741 692 693 +f 741 740 692 +f 742 693 694 +f 742 741 693 +f 743 694 695 +f 743 742 694 +f 744 695 696 +f 744 743 695 +f 745 696 697 +f 745 744 696 +f 746 697 698 +f 746 745 697 +f 747 698 699 +f 747 746 698 +f 748 699 700 +f 748 747 699 +f 749 700 701 +f 749 748 700 +f 750 701 702 +f 750 749 701 +f 751 702 703 +f 751 750 702 +f 752 703 704 +f 752 751 703 +f 753 704 705 +f 753 752 704 +f 754 705 706 +f 754 753 705 +f 755 706 707 +f 755 754 706 +f 756 707 708 +f 756 755 707 +f 757 708 709 +f 757 756 708 +f 758 709 710 +f 758 757 709 +f 759 710 711 +f 759 758 710 +f 760 711 712 +f 760 759 711 +f 761 712 713 +f 761 760 712 +f 762 713 714 +f 762 761 713 +f 763 714 715 +f 763 762 714 +f 764 715 716 +f 764 763 715 +f 765 716 717 +f 765 764 716 +f 766 717 718 +f 766 765 717 +f 767 718 719 +f 767 766 718 +f 768 719 720 +f 768 767 719 +f 722 720 674 +f 722 768 720 +f 769 722 721 +f 769 770 722 +f 771 721 723 +f 771 769 721 +f 772 723 724 +f 772 771 723 +f 773 724 725 +f 773 772 724 +f 774 725 726 +f 774 773 725 +f 775 726 727 +f 775 774 726 +f 776 727 728 +f 776 775 727 +f 777 728 729 +f 777 776 728 +f 778 729 730 +f 778 777 729 +f 779 730 731 +f 779 778 730 +f 780 731 732 +f 780 779 731 +f 781 732 733 +f 781 780 732 +f 782 733 734 +f 782 781 733 +f 783 734 735 +f 783 782 734 +f 783 735 736 +f 784 783 736 +f 785 736 737 +f 785 784 736 +f 786 737 738 +f 786 785 737 +f 787 738 739 +f 787 786 738 +f 788 739 740 +f 788 787 739 +f 788 740 741 +f 789 788 741 +f 790 741 742 +f 790 789 741 +f 791 742 743 +f 791 790 742 +f 792 743 744 +f 792 791 743 +f 793 744 745 +f 793 792 744 +f 794 745 746 +f 794 793 745 +f 795 746 747 +f 795 794 746 +f 796 747 748 +f 796 795 747 +f 797 748 749 +f 797 796 748 +f 798 749 750 +f 798 797 749 +f 799 750 751 +f 799 798 750 +f 800 751 752 +f 800 799 751 +f 801 752 753 +f 801 800 752 +f 802 753 754 +f 802 801 753 +f 803 754 755 +f 803 802 754 +f 804 755 756 +f 804 803 755 +f 805 756 757 +f 805 804 756 +f 806 757 758 +f 806 805 757 +f 807 758 759 +f 807 806 758 +f 807 759 760 +f 808 807 760 +f 809 760 761 +f 809 808 760 +f 809 761 762 +f 810 809 762 +f 811 762 763 +f 811 810 762 +f 812 763 764 +f 812 811 763 +f 813 764 765 +f 813 812 764 +f 814 765 766 +f 814 813 765 +f 815 766 767 +f 815 814 766 +f 816 767 768 +f 816 815 767 +f 770 768 722 +f 770 816 768 +f 817 770 769 +f 817 818 770 +f 819 769 771 +f 819 817 769 +f 819 771 772 +f 820 819 772 +f 821 772 773 +f 821 820 772 +f 822 773 774 +f 822 821 773 +f 823 774 775 +f 823 822 774 +f 824 775 776 +f 824 823 775 +f 825 776 777 +f 825 824 776 +f 826 777 778 +f 826 825 777 +f 827 778 779 +f 827 826 778 +f 828 779 780 +f 828 827 779 +f 829 780 781 +f 829 828 780 +f 829 781 782 +f 830 829 782 +f 831 782 783 +f 831 830 782 +f 832 783 784 +f 832 831 783 +f 832 784 785 +f 833 832 785 +f 833 785 786 +f 834 833 786 +f 835 786 787 +f 835 834 786 +f 836 787 788 +f 836 835 787 +f 837 788 789 +f 837 836 788 +f 838 789 790 +f 838 837 789 +f 838 790 791 +f 839 838 791 +f 840 791 792 +f 840 839 791 +f 841 792 793 +f 841 840 792 +f 842 793 794 +f 842 841 793 +f 842 794 795 +f 843 842 795 +f 844 795 796 +f 844 843 795 +f 845 796 797 +f 845 844 796 +f 846 797 798 +f 846 845 797 +f 847 798 799 +f 847 846 798 +f 848 799 800 +f 848 847 799 +f 849 800 801 +f 849 848 800 +f 850 801 802 +f 850 849 801 +f 851 802 803 +f 851 850 802 +f 852 803 804 +f 852 851 803 +f 853 804 805 +f 853 852 804 +f 853 805 806 +f 854 853 806 +f 854 806 807 +f 855 854 807 +f 856 807 808 +f 856 855 807 +f 857 808 809 +f 857 856 808 +f 858 809 810 +f 858 857 809 +f 859 810 811 +f 859 858 810 +f 860 811 812 +f 860 859 811 +f 860 812 813 +f 861 860 813 +f 862 813 814 +f 862 861 813 +f 863 814 815 +f 863 862 814 +f 864 815 816 +f 864 863 815 +f 818 816 770 +f 818 864 816 +f 865 818 817 +f 865 866 818 +f 865 817 819 +f 867 865 819 +f 868 819 820 +f 868 867 819 +f 868 820 821 +f 869 868 821 +f 869 821 822 +f 870 869 822 +f 871 822 823 +f 871 870 822 +f 872 823 824 +f 872 871 823 +f 873 824 825 +f 873 872 824 +f 873 825 826 +f 874 873 826 +f 875 826 827 +f 875 874 826 +f 876 827 828 +f 876 875 827 +f 877 828 829 +f 877 876 828 +f 877 829 830 +f 878 877 830 +f 878 830 831 +f 879 878 831 +f 880 831 832 +f 880 879 831 +f 881 832 833 +f 881 880 832 +f 882 833 834 +f 882 881 833 +f 883 834 835 +f 883 882 834 +f 884 835 836 +f 884 883 835 +f 885 836 837 +f 885 884 836 +f 886 837 838 +f 886 885 837 +f 887 838 839 +f 887 886 838 +f 888 839 840 +f 888 887 839 +f 889 840 841 +f 889 888 840 +f 890 841 842 +f 890 889 841 +f 891 842 843 +f 891 890 842 +f 892 843 844 +f 892 891 843 +f 893 844 845 +f 893 892 844 +f 894 845 846 +f 894 893 845 +f 895 846 847 +f 895 894 846 +f 895 847 848 +f 896 895 848 +f 897 848 849 +f 897 896 848 +f 898 849 850 +f 898 897 849 +f 899 850 851 +f 899 898 850 +f 900 851 852 +f 900 899 851 +f 900 852 853 +f 901 900 853 +f 902 853 854 +f 902 901 853 +f 902 854 855 +f 903 902 855 +f 904 855 856 +f 904 903 855 +f 905 856 857 +f 905 904 856 +f 906 857 858 +f 906 905 857 +f 907 858 859 +f 907 906 858 +f 907 859 860 +f 908 907 860 +f 909 860 861 +f 909 908 860 +f 910 861 862 +f 910 909 861 +f 910 862 863 +f 911 910 863 +f 912 863 864 +f 912 911 863 +f 866 864 818 +f 866 912 864 +f 913 866 865 +f 913 914 866 +f 915 865 867 +f 915 913 865 +f 916 867 868 +f 916 915 867 +f 917 868 869 +f 917 916 868 +f 917 869 870 +f 918 917 870 +f 919 870 871 +f 919 918 870 +f 920 871 872 +f 920 919 871 +f 921 872 873 +f 921 920 872 +f 922 873 874 +f 922 921 873 +f 923 874 875 +f 923 922 874 +f 924 875 876 +f 924 923 875 +f 925 876 877 +f 925 924 876 +f 926 877 878 +f 926 925 877 +f 927 878 879 +f 927 926 878 +f 928 879 880 +f 928 927 879 +f 929 880 881 +f 929 928 880 +f 930 881 882 +f 930 929 881 +f 931 882 883 +f 931 930 882 +f 932 883 884 +f 932 931 883 +f 933 884 885 +f 933 932 884 +f 934 885 886 +f 934 933 885 +f 935 886 887 +f 935 934 886 +f 936 887 888 +f 936 935 887 +f 937 888 889 +f 937 936 888 +f 938 889 890 +f 938 937 889 +f 939 890 891 +f 939 938 890 +f 940 891 892 +f 940 939 891 +f 941 892 893 +f 941 940 892 +f 942 893 894 +f 942 941 893 +f 943 894 895 +f 943 942 894 +f 944 895 896 +f 944 943 895 +f 945 896 897 +f 945 944 896 +f 946 897 898 +f 946 945 897 +f 947 898 899 +f 947 946 898 +f 948 899 900 +f 948 947 899 +f 948 900 901 +f 949 948 901 +f 949 901 902 +f 950 949 902 +f 951 902 903 +f 951 950 902 +f 952 903 904 +f 952 951 903 +f 952 904 905 +f 953 952 905 +f 954 905 906 +f 954 953 905 +f 955 906 907 +f 955 954 906 +f 956 907 908 +f 956 955 907 +f 957 908 909 +f 957 956 908 +f 958 909 910 +f 958 957 909 +f 959 910 911 +f 959 958 910 +f 960 911 912 +f 960 959 911 +f 914 912 866 +f 914 960 912 +f 961 914 913 +f 961 962 914 +f 963 913 915 +f 963 961 913 +f 964 915 916 +f 964 963 915 +f 965 916 917 +f 965 964 916 +f 966 917 918 +f 966 965 917 +f 967 918 919 +f 967 966 918 +f 968 919 920 +f 968 967 919 +f 969 920 921 +f 969 968 920 +f 970 921 922 +f 970 969 921 +f 971 922 923 +f 971 970 922 +f 972 923 924 +f 972 971 923 +f 973 924 925 +f 973 972 924 +f 974 925 926 +f 974 973 925 +f 975 926 927 +f 975 974 926 +f 976 927 928 +f 976 975 927 +f 977 928 929 +f 977 976 928 +f 978 929 930 +f 978 977 929 +f 979 930 931 +f 979 978 930 +f 980 931 932 +f 980 979 931 +f 981 932 933 +f 981 980 932 +f 982 933 934 +f 982 981 933 +f 983 934 935 +f 983 982 934 +f 984 935 936 +f 984 983 935 +f 985 936 937 +f 985 984 936 +f 986 937 938 +f 986 985 937 +f 987 938 939 +f 987 986 938 +f 988 939 940 +f 988 987 939 +f 989 940 941 +f 989 988 940 +f 989 941 942 +f 990 989 942 +f 991 942 943 +f 991 990 942 +f 992 943 944 +f 992 991 943 +f 993 944 945 +f 993 992 944 +f 994 945 946 +f 994 993 945 +f 995 946 947 +f 995 994 946 +f 996 947 948 +f 996 995 947 +f 997 948 949 +f 997 996 948 +f 997 949 950 +f 998 997 950 +f 999 950 951 +f 999 998 950 +f 999 951 952 +f 1000 999 952 +f 1001 952 953 +f 1001 1000 952 +f 1002 953 954 +f 1002 1001 953 +f 1003 954 955 +f 1003 1002 954 +f 1004 955 956 +f 1004 1003 955 +f 1005 956 957 +f 1005 1004 956 +f 1006 957 958 +f 1006 1005 957 +f 1007 958 959 +f 1007 1006 958 +f 1008 959 960 +f 1008 1007 959 +f 962 960 914 +f 962 1008 960 +f 1009 962 961 +f 1009 1010 962 +f 1009 961 963 +f 1011 1009 963 +f 1012 963 964 +f 1012 1011 963 +f 1013 964 965 +f 1013 1012 964 +f 1014 965 966 +f 1014 1013 965 +f 1014 966 967 +f 1015 1014 967 +f 1016 967 968 +f 1016 1015 967 +f 1017 968 969 +f 1017 1016 968 +f 1017 969 970 +f 1018 1017 970 +f 1019 970 971 +f 1019 1018 970 +f 1020 971 972 +f 1020 1019 971 +f 1021 972 973 +f 1021 1020 972 +f 1022 973 974 +f 1022 1021 973 +f 1023 974 975 +f 1023 1022 974 +f 1024 975 976 +f 1024 1023 975 +f 1025 976 977 +f 1025 1024 976 +f 1026 977 978 +f 1026 1025 977 +f 1027 978 979 +f 1027 1026 978 +f 1028 979 980 +f 1028 1027 979 +f 1029 980 981 +f 1029 1028 980 +f 1030 981 982 +f 1030 1029 981 +f 1031 982 983 +f 1031 1030 982 +f 1032 983 984 +f 1032 1031 983 +f 1033 984 985 +f 1033 1032 984 +f 1033 985 986 +f 1034 1033 986 +f 1035 986 987 +f 1035 1034 986 +f 1036 987 988 +f 1036 1035 987 +f 1037 988 989 +f 1037 1036 988 +f 1038 989 990 +f 1038 1037 989 +f 1038 990 991 +f 1039 1038 991 +f 1040 991 992 +f 1040 1039 991 +f 1041 992 993 +f 1041 1040 992 +f 1042 993 994 +f 1042 1041 993 +f 1043 994 995 +f 1043 1042 994 +f 1044 995 996 +f 1044 1043 995 +f 1045 996 997 +f 1045 1044 996 +f 1046 997 998 +f 1046 1045 997 +f 1047 998 999 +f 1047 1046 998 +f 1048 999 1000 +f 1048 1047 999 +f 1049 1000 1001 +f 1049 1048 1000 +f 1050 1001 1002 +f 1050 1049 1001 +f 1051 1002 1003 +f 1051 1050 1002 +f 1052 1003 1004 +f 1052 1051 1003 +f 1053 1004 1005 +f 1053 1052 1004 +f 1054 1005 1006 +f 1054 1053 1005 +f 1055 1006 1007 +f 1055 1054 1006 +f 1056 1007 1008 +f 1056 1055 1007 +f 1010 1008 962 +f 1010 1056 1008 +f 1057 2 1058 +f 1057 3 2 +f 1059 3 1057 +f 1059 6 3 +f 1060 6 1059 +f 1060 8 6 +f 1061 8 1060 +f 1061 10 8 +f 1062 10 1061 +f 1062 12 10 +f 1063 12 1062 +f 1063 13 12 +f 1064 13 1063 +f 1064 15 13 +f 1065 15 1064 +f 1065 18 15 +f 1066 18 1065 +f 1066 20 18 +f 1067 20 1066 +f 1067 22 20 +f 1068 22 1067 +f 1068 24 22 +f 1069 24 1068 +f 1069 26 24 +f 1070 26 1069 +f 1070 28 26 +f 1070 30 28 +f 1071 30 1070 +f 1072 30 1071 +f 1072 32 30 +f 1073 32 1072 +f 1073 34 32 +f 1073 36 34 +f 1074 36 1073 +f 1075 36 1074 +f 1075 38 36 +f 1076 38 1075 +f 1076 40 38 +f 1077 40 1076 +f 1077 42 40 +f 1078 42 1077 +f 1078 44 42 +f 1079 44 1078 +f 1079 46 44 +f 1080 46 1079 +f 1080 48 46 +f 1081 48 1080 +f 1081 50 48 +f 1082 50 1081 +f 1082 51 50 +f 1083 51 1082 +f 1083 54 51 +f 1084 54 1083 +f 1084 56 54 +f 1085 56 1084 +f 1085 58 56 +f 1086 58 1085 +f 1086 60 58 +f 1087 60 1086 +f 1087 61 60 +f 1088 61 1087 +f 1088 63 61 +f 1089 63 1088 +f 1089 66 63 +f 1090 66 1089 +f 1090 68 66 +f 1091 68 1090 +f 1091 70 68 +f 1092 70 1091 +f 1092 72 70 +f 1093 72 1092 +f 1093 74 72 +f 1094 74 1093 +f 1094 76 74 +f 1095 76 1094 +f 1095 78 76 +f 1095 80 78 +f 1096 80 1095 +f 1097 80 1096 +f 1097 82 80 +f 1098 82 1097 +f 1098 84 82 +f 1099 84 1098 +f 1099 86 84 +f 1100 86 1099 +f 1100 88 86 +f 1101 88 1100 +f 1101 90 88 +f 1102 90 1101 +f 1102 92 90 +f 1103 92 1102 +f 1103 94 92 +f 1104 94 1103 +f 1104 96 94 +f 1058 96 1104 +f 1058 2 96 +f 1105 1058 1106 +f 1105 1057 1058 +f 1107 1057 1105 +f 1107 1059 1057 +f 1108 1059 1107 +f 1108 1060 1059 +f 1109 1060 1108 +f 1109 1061 1060 +f 1110 1061 1109 +f 1110 1062 1061 +f 1111 1062 1110 +f 1111 1063 1062 +f 1112 1063 1111 +f 1112 1064 1063 +f 1113 1064 1112 +f 1113 1065 1064 +f 1114 1065 1113 +f 1114 1066 1065 +f 1115 1066 1114 +f 1115 1067 1066 +f 1116 1067 1115 +f 1116 1068 1067 +f 1117 1068 1116 +f 1117 1069 1068 +f 1118 1069 1117 +f 1118 1070 1069 +f 1119 1070 1118 +f 1119 1071 1070 +f 1120 1071 1119 +f 1120 1072 1071 +f 1121 1072 1120 +f 1121 1073 1072 +f 1122 1073 1121 +f 1122 1074 1073 +f 1123 1074 1122 +f 1123 1075 1074 +f 1124 1075 1123 +f 1124 1076 1075 +f 1124 1077 1076 +f 1125 1077 1124 +f 1126 1077 1125 +f 1126 1078 1077 +f 1127 1078 1126 +f 1127 1079 1078 +f 1128 1079 1127 +f 1128 1080 1079 +f 1129 1080 1128 +f 1129 1081 1080 +f 1130 1081 1129 +f 1130 1082 1081 +f 1131 1082 1130 +f 1131 1083 1082 +f 1132 1083 1131 +f 1132 1084 1083 +f 1133 1084 1132 +f 1133 1085 1084 +f 1134 1085 1133 +f 1134 1086 1085 +f 1135 1086 1134 +f 1135 1087 1086 +f 1136 1087 1135 +f 1136 1088 1087 +f 1136 1089 1088 +f 1137 1089 1136 +f 1138 1089 1137 +f 1138 1090 1089 +f 1139 1090 1138 +f 1139 1091 1090 +f 1140 1091 1139 +f 1140 1092 1091 +f 1141 1092 1140 +f 1141 1093 1092 +f 1142 1093 1141 +f 1142 1094 1093 +f 1143 1094 1142 +f 1143 1095 1094 +f 1144 1095 1143 +f 1144 1096 1095 +f 1145 1096 1144 +f 1145 1097 1096 +f 1146 1097 1145 +f 1146 1098 1097 +f 1147 1098 1146 +f 1147 1099 1098 +f 1148 1099 1147 +f 1148 1100 1099 +f 1149 1100 1148 +f 1149 1101 1100 +f 1150 1101 1149 +f 1150 1102 1101 +f 1151 1102 1150 +f 1151 1103 1102 +f 1152 1103 1151 +f 1152 1104 1103 +f 1106 1104 1152 +f 1106 1058 1104 +f 1153 1106 1154 +f 1153 1105 1106 +f 1155 1105 1153 +f 1155 1107 1105 +f 1156 1107 1155 +f 1156 1108 1107 +f 1157 1108 1156 +f 1157 1109 1108 +f 1158 1109 1157 +f 1158 1110 1109 +f 1159 1110 1158 +f 1159 1111 1110 +f 1160 1111 1159 +f 1160 1112 1111 +f 1161 1112 1160 +f 1161 1113 1112 +f 1162 1113 1161 +f 1162 1114 1113 +f 1163 1114 1162 +f 1163 1115 1114 +f 1164 1115 1163 +f 1164 1116 1115 +f 1165 1116 1164 +f 1165 1117 1116 +f 1166 1117 1165 +f 1166 1118 1117 +f 1167 1118 1166 +f 1167 1119 1118 +f 1168 1119 1167 +f 1168 1120 1119 +f 1169 1120 1168 +f 1169 1121 1120 +f 1170 1121 1169 +f 1170 1122 1121 +f 1171 1122 1170 +f 1171 1123 1122 +f 1172 1123 1171 +f 1172 1124 1123 +f 1173 1124 1172 +f 1173 1125 1124 +f 1174 1125 1173 +f 1174 1126 1125 +f 1175 1126 1174 +f 1175 1127 1126 +f 1176 1127 1175 +f 1176 1128 1127 +f 1177 1128 1176 +f 1177 1129 1128 +f 1178 1129 1177 +f 1178 1130 1129 +f 1179 1130 1178 +f 1179 1131 1130 +f 1180 1131 1179 +f 1180 1132 1131 +f 1181 1132 1180 +f 1181 1133 1132 +f 1182 1133 1181 +f 1182 1134 1133 +f 1183 1134 1182 +f 1183 1135 1134 +f 1184 1135 1183 +f 1184 1136 1135 +f 1185 1136 1184 +f 1185 1137 1136 +f 1186 1137 1185 +f 1186 1138 1137 +f 1187 1138 1186 +f 1187 1139 1138 +f 1188 1139 1187 +f 1188 1140 1139 +f 1189 1140 1188 +f 1189 1141 1140 +f 1190 1141 1189 +f 1190 1142 1141 +f 1191 1142 1190 +f 1191 1143 1142 +f 1192 1143 1191 +f 1192 1144 1143 +f 1193 1144 1192 +f 1193 1145 1144 +f 1194 1145 1193 +f 1194 1146 1145 +f 1195 1146 1194 +f 1195 1147 1146 +f 1196 1147 1195 +f 1196 1148 1147 +f 1197 1148 1196 +f 1197 1149 1148 +f 1198 1149 1197 +f 1198 1150 1149 +f 1199 1150 1198 +f 1199 1151 1150 +f 1200 1151 1199 +f 1200 1152 1151 +f 1154 1152 1200 +f 1154 1106 1152 +f 1201 1154 1202 +f 1201 1153 1154 +f 1203 1153 1201 +f 1203 1155 1153 +f 1204 1155 1203 +f 1204 1156 1155 +f 1205 1156 1204 +f 1205 1157 1156 +f 1206 1157 1205 +f 1206 1158 1157 +f 1207 1158 1206 +f 1207 1159 1158 +f 1208 1159 1207 +f 1208 1160 1159 +f 1209 1160 1208 +f 1209 1161 1160 +f 1210 1161 1209 +f 1210 1162 1161 +f 1211 1162 1210 +f 1211 1163 1162 +f 1212 1163 1211 +f 1212 1164 1163 +f 1213 1164 1212 +f 1213 1165 1164 +f 1214 1165 1213 +f 1214 1166 1165 +f 1215 1166 1214 +f 1215 1167 1166 +f 1216 1167 1215 +f 1216 1168 1167 +f 1217 1168 1216 +f 1217 1169 1168 +f 1218 1169 1217 +f 1218 1170 1169 +f 1219 1170 1218 +f 1219 1171 1170 +f 1220 1171 1219 +f 1220 1172 1171 +f 1221 1172 1220 +f 1221 1173 1172 +f 1222 1173 1221 +f 1222 1174 1173 +f 1223 1174 1222 +f 1223 1175 1174 +f 1224 1175 1223 +f 1224 1176 1175 +f 1225 1176 1224 +f 1225 1177 1176 +f 1226 1177 1225 +f 1226 1178 1177 +f 1227 1178 1226 +f 1227 1179 1178 +f 1228 1179 1227 +f 1228 1180 1179 +f 1229 1180 1228 +f 1229 1181 1180 +f 1230 1181 1229 +f 1230 1182 1181 +f 1231 1182 1230 +f 1231 1183 1182 +f 1232 1183 1231 +f 1232 1184 1183 +f 1233 1184 1232 +f 1233 1185 1184 +f 1234 1185 1233 +f 1234 1186 1185 +f 1235 1186 1234 +f 1235 1187 1186 +f 1236 1187 1235 +f 1236 1188 1187 +f 1237 1188 1236 +f 1237 1189 1188 +f 1238 1189 1237 +f 1238 1190 1189 +f 1239 1190 1238 +f 1239 1191 1190 +f 1240 1191 1239 +f 1240 1192 1191 +f 1241 1192 1240 +f 1241 1193 1192 +f 1242 1193 1241 +f 1242 1194 1193 +f 1243 1194 1242 +f 1243 1195 1194 +f 1244 1195 1243 +f 1244 1196 1195 +f 1245 1196 1244 +f 1245 1197 1196 +f 1246 1197 1245 +f 1246 1198 1197 +f 1247 1198 1246 +f 1247 1199 1198 +f 1248 1199 1247 +f 1248 1200 1199 +f 1202 1200 1248 +f 1202 1154 1200 +f 1249 1202 1250 +f 1249 1201 1202 +f 1251 1201 1249 +f 1251 1203 1201 +f 1252 1203 1251 +f 1252 1204 1203 +f 1253 1204 1252 +f 1253 1205 1204 +f 1254 1205 1253 +f 1254 1206 1205 +f 1255 1206 1254 +f 1255 1207 1206 +f 1256 1207 1255 +f 1256 1208 1207 +f 1257 1208 1256 +f 1257 1209 1208 +f 1258 1209 1257 +f 1258 1210 1209 +f 1259 1210 1258 +f 1259 1211 1210 +f 1260 1211 1259 +f 1260 1212 1211 +f 1261 1212 1260 +f 1261 1213 1212 +f 1262 1213 1261 +f 1262 1214 1213 +f 1263 1214 1262 +f 1263 1215 1214 +f 1264 1215 1263 +f 1264 1216 1215 +f 1265 1216 1264 +f 1265 1217 1216 +f 1266 1217 1265 +f 1266 1218 1217 +f 1267 1218 1266 +f 1267 1219 1218 +f 1268 1219 1267 +f 1268 1220 1219 +f 1269 1220 1268 +f 1269 1221 1220 +f 1270 1221 1269 +f 1270 1222 1221 +f 1271 1222 1270 +f 1271 1223 1222 +f 1272 1223 1271 +f 1272 1224 1223 +f 1273 1224 1272 +f 1273 1225 1224 +f 1274 1225 1273 +f 1274 1226 1225 +f 1275 1226 1274 +f 1275 1227 1226 +f 1276 1227 1275 +f 1276 1228 1227 +f 1277 1228 1276 +f 1277 1229 1228 +f 1278 1229 1277 +f 1278 1230 1229 +f 1279 1230 1278 +f 1279 1231 1230 +f 1280 1231 1279 +f 1280 1232 1231 +f 1281 1232 1280 +f 1281 1233 1232 +f 1282 1233 1281 +f 1282 1234 1233 +f 1283 1234 1282 +f 1283 1235 1234 +f 1284 1235 1283 +f 1284 1236 1235 +f 1285 1236 1284 +f 1285 1237 1236 +f 1286 1237 1285 +f 1286 1238 1237 +f 1287 1238 1286 +f 1287 1239 1238 +f 1288 1239 1287 +f 1288 1240 1239 +f 1289 1240 1288 +f 1289 1241 1240 +f 1290 1241 1289 +f 1290 1242 1241 +f 1291 1242 1290 +f 1291 1243 1242 +f 1292 1243 1291 +f 1292 1244 1243 +f 1293 1244 1292 +f 1293 1245 1244 +f 1294 1245 1293 +f 1294 1246 1245 +f 1295 1246 1294 +f 1295 1247 1246 +f 1296 1247 1295 +f 1296 1248 1247 +f 1250 1248 1296 +f 1250 1202 1248 +f 1297 1250 1298 +f 1297 1249 1250 +f 1299 1249 1297 +f 1299 1251 1249 +f 1300 1251 1299 +f 1300 1252 1251 +f 1301 1252 1300 +f 1301 1253 1252 +f 1302 1253 1301 +f 1302 1254 1253 +f 1303 1254 1302 +f 1303 1255 1254 +f 1304 1255 1303 +f 1304 1256 1255 +f 1305 1256 1304 +f 1305 1257 1256 +f 1306 1257 1305 +f 1306 1258 1257 +f 1307 1258 1306 +f 1307 1259 1258 +f 1308 1259 1307 +f 1308 1260 1259 +f 1309 1260 1308 +f 1309 1261 1260 +f 1310 1261 1309 +f 1310 1262 1261 +f 1311 1262 1310 +f 1311 1263 1262 +f 1312 1263 1311 +f 1312 1264 1263 +f 1313 1264 1312 +f 1313 1265 1264 +f 1314 1265 1313 +f 1314 1266 1265 +f 1315 1266 1314 +f 1315 1267 1266 +f 1316 1267 1315 +f 1316 1268 1267 +f 1317 1268 1316 +f 1317 1269 1268 +f 1318 1269 1317 +f 1318 1270 1269 +f 1319 1270 1318 +f 1319 1271 1270 +f 1320 1271 1319 +f 1320 1272 1271 +f 1321 1272 1320 +f 1321 1273 1272 +f 1322 1273 1321 +f 1322 1274 1273 +f 1323 1274 1322 +f 1323 1275 1274 +f 1324 1275 1323 +f 1324 1276 1275 +f 1325 1276 1324 +f 1325 1277 1276 +f 1326 1277 1325 +f 1326 1278 1277 +f 1327 1278 1326 +f 1327 1279 1278 +f 1328 1279 1327 +f 1328 1280 1279 +f 1329 1280 1328 +f 1329 1281 1280 +f 1330 1281 1329 +f 1330 1282 1281 +f 1331 1282 1330 +f 1331 1283 1282 +f 1332 1283 1331 +f 1332 1284 1283 +f 1333 1284 1332 +f 1333 1285 1284 +f 1334 1285 1333 +f 1334 1286 1285 +f 1335 1286 1334 +f 1335 1287 1286 +f 1336 1287 1335 +f 1336 1288 1287 +f 1337 1288 1336 +f 1337 1289 1288 +f 1338 1289 1337 +f 1338 1290 1289 +f 1339 1290 1338 +f 1339 1291 1290 +f 1340 1291 1339 +f 1340 1292 1291 +f 1341 1292 1340 +f 1341 1293 1292 +f 1342 1293 1341 +f 1342 1294 1293 +f 1343 1294 1342 +f 1343 1295 1294 +f 1344 1295 1343 +f 1344 1296 1295 +f 1298 1296 1344 +f 1298 1250 1296 +f 1345 1298 1346 +f 1345 1297 1298 +f 1347 1297 1345 +f 1347 1299 1297 +f 1348 1299 1347 +f 1348 1300 1299 +f 1349 1300 1348 +f 1349 1301 1300 +f 1350 1301 1349 +f 1350 1302 1301 +f 1351 1302 1350 +f 1351 1303 1302 +f 1352 1303 1351 +f 1352 1304 1303 +f 1353 1304 1352 +f 1353 1305 1304 +f 1354 1305 1353 +f 1354 1306 1305 +f 1355 1306 1354 +f 1355 1307 1306 +f 1356 1307 1355 +f 1356 1308 1307 +f 1357 1308 1356 +f 1357 1309 1308 +f 1358 1309 1357 +f 1358 1310 1309 +f 1359 1310 1358 +f 1359 1311 1310 +f 1360 1311 1359 +f 1360 1312 1311 +f 1361 1312 1360 +f 1361 1313 1312 +f 1362 1313 1361 +f 1362 1314 1313 +f 1363 1314 1362 +f 1363 1315 1314 +f 1364 1315 1363 +f 1364 1316 1315 +f 1365 1316 1364 +f 1365 1317 1316 +f 1366 1317 1365 +f 1366 1318 1317 +f 1367 1318 1366 +f 1367 1319 1318 +f 1368 1319 1367 +f 1368 1320 1319 +f 1369 1320 1368 +f 1369 1321 1320 +f 1370 1321 1369 +f 1370 1322 1321 +f 1371 1322 1370 +f 1371 1323 1322 +f 1372 1323 1371 +f 1372 1324 1323 +f 1373 1324 1372 +f 1373 1325 1324 +f 1374 1325 1373 +f 1374 1326 1325 +f 1375 1326 1374 +f 1375 1327 1326 +f 1376 1327 1375 +f 1376 1328 1327 +f 1377 1328 1376 +f 1377 1329 1328 +f 1378 1329 1377 +f 1378 1330 1329 +f 1379 1330 1378 +f 1379 1331 1330 +f 1380 1331 1379 +f 1380 1332 1331 +f 1381 1332 1380 +f 1381 1333 1332 +f 1382 1333 1381 +f 1382 1334 1333 +f 1383 1334 1382 +f 1383 1335 1334 +f 1384 1335 1383 +f 1384 1336 1335 +f 1385 1336 1384 +f 1385 1337 1336 +f 1386 1337 1385 +f 1386 1338 1337 +f 1387 1338 1386 +f 1387 1339 1338 +f 1388 1339 1387 +f 1388 1340 1339 +f 1389 1340 1388 +f 1389 1341 1340 +f 1390 1341 1389 +f 1390 1342 1341 +f 1391 1342 1390 +f 1391 1343 1342 +f 1392 1343 1391 +f 1392 1344 1343 +f 1346 1344 1392 +f 1346 1298 1344 +f 1393 1346 1394 +f 1393 1345 1346 +f 1395 1345 1393 +f 1395 1347 1345 +f 1396 1347 1395 +f 1396 1348 1347 +f 1397 1348 1396 +f 1397 1349 1348 +f 1398 1349 1397 +f 1398 1350 1349 +f 1399 1350 1398 +f 1399 1351 1350 +f 1400 1351 1399 +f 1400 1352 1351 +f 1401 1352 1400 +f 1401 1353 1352 +f 1402 1353 1401 +f 1402 1354 1353 +f 1403 1354 1402 +f 1403 1355 1354 +f 1404 1355 1403 +f 1404 1356 1355 +f 1404 1357 1356 +f 1405 1357 1404 +f 1406 1357 1405 +f 1406 1358 1357 +f 1407 1358 1406 +f 1407 1359 1358 +f 1408 1359 1407 +f 1408 1360 1359 +f 1409 1360 1408 +f 1409 1361 1360 +f 1410 1361 1409 +f 1410 1362 1361 +f 1411 1362 1410 +f 1411 1363 1362 +f 1412 1363 1411 +f 1412 1364 1363 +f 1413 1364 1412 +f 1413 1365 1364 +f 1414 1365 1413 +f 1414 1366 1365 +f 1415 1366 1414 +f 1415 1367 1366 +f 1416 1367 1415 +f 1416 1368 1367 +f 1417 1368 1416 +f 1417 1369 1368 +f 1418 1369 1417 +f 1418 1370 1369 +f 1419 1370 1418 +f 1419 1371 1370 +f 1420 1371 1419 +f 1420 1372 1371 +f 1421 1372 1420 +f 1421 1373 1372 +f 1422 1373 1421 +f 1422 1374 1373 +f 1423 1374 1422 +f 1423 1375 1374 +f 1424 1375 1423 +f 1424 1376 1375 +f 1425 1376 1424 +f 1425 1377 1376 +f 1426 1377 1425 +f 1426 1378 1377 +f 1427 1378 1426 +f 1427 1379 1378 +f 1428 1379 1427 +f 1428 1380 1379 +f 1429 1380 1428 +f 1429 1381 1380 +f 1430 1381 1429 +f 1430 1382 1381 +f 1431 1382 1430 +f 1431 1383 1382 +f 1432 1383 1431 +f 1432 1384 1383 +f 1433 1384 1432 +f 1433 1385 1384 +f 1434 1385 1433 +f 1434 1386 1385 +f 1435 1386 1434 +f 1435 1387 1386 +f 1436 1387 1435 +f 1436 1388 1387 +f 1437 1388 1436 +f 1437 1389 1388 +f 1438 1389 1437 +f 1438 1390 1389 +f 1439 1390 1438 +f 1439 1391 1390 +f 1440 1391 1439 +f 1440 1392 1391 +f 1394 1392 1440 +f 1394 1346 1392 +f 1441 1442 42 +f 1443 1442 1441 +f 1444 1442 1443 +f 1444 1445 1442 +f 1446 1445 1444 +f 1446 1447 1445 +f 1448 1447 1446 +f 1448 1449 1447 +f 1450 1449 1448 +f 1450 1451 1449 +f 1452 1451 1450 +f 1452 1453 1451 +f 1454 1453 1452 +f 1454 1455 1453 +f 1456 1455 1454 +f 1456 1457 1455 +f 1458 1457 1456 +f 1458 1459 1457 +f 1460 1459 1458 +f 1460 1461 1459 +f 1462 1461 1460 +f 1462 1463 1461 +f 1464 1463 1462 +f 1464 1465 1463 +f 1466 1465 1464 +f 1466 1467 1465 +f 1468 1467 1466 +f 1468 1469 1467 +f 1470 1469 1468 +f 1470 1471 1469 +f 1472 1471 1470 +f 1472 1473 1471 +f 1474 1473 1472 +f 1474 1475 1473 +f 1476 1475 1474 +f 1476 1477 1475 +f 1478 1477 1476 +f 1478 1479 1477 +f 1480 1479 1478 +f 1480 1481 1479 +f 1482 1481 1480 +f 1482 1483 1481 +f 1484 1483 1482 +f 1484 1485 1483 +f 1486 1485 1484 +f 1486 1487 1485 +f 1488 1487 1486 +f 1488 1489 1487 +f 1490 1489 1488 +f 1490 1491 1489 +f 1492 1491 1490 +f 1492 1493 1491 +f 1494 1493 1492 +f 1494 1495 1493 +f 1496 1495 1494 +f 1496 1497 1495 +f 1498 1497 1496 +f 1498 1499 1497 +f 1500 1499 1498 +f 1500 1501 1499 +f 1502 1501 1500 +f 1502 1503 1501 +f 1504 1503 1502 +f 1504 1505 1503 +f 1506 1505 1504 +f 1506 1507 1505 +f 1508 1507 1506 +f 1508 1509 1507 +f 1510 1509 1508 +f 1510 1511 1509 +f 1512 1511 1510 +f 1512 1513 1511 +f 1514 1513 1512 +f 1514 1515 1513 +f 1516 1515 1514 +f 1516 1517 1515 +f 1518 1517 1516 +f 1518 1519 1517 +f 1518 1520 1519 +f 1521 1520 1518 +f 1522 1520 1521 +f 1522 1523 1520 +f 1524 1523 1522 +f 1524 1525 1523 +f 1526 1525 1524 +f 1526 1527 1525 +f 1528 1527 1526 +f 1528 1529 1527 +f 1530 1529 1528 +f 1530 1531 1529 +f 1532 1531 1530 +f 1532 1533 1531 +f 1534 1533 1532 +f 1534 1535 1533 +f 1534 42 1535 +f 1441 42 1534 +f 1536 1441 1537 +f 1536 1443 1441 +f 1538 1443 1536 +f 1538 1444 1443 +f 1539 1444 1538 +f 1539 1446 1444 +f 1540 1446 1539 +f 1540 1448 1446 +f 1541 1448 1540 +f 1541 1450 1448 +f 1542 1450 1541 +f 1542 1452 1450 +f 1543 1452 1542 +f 1543 1454 1452 +f 1544 1454 1543 +f 1544 1456 1454 +f 1545 1456 1544 +f 1545 1458 1456 +f 1546 1458 1545 +f 1546 1460 1458 +f 1547 1460 1546 +f 1547 1462 1460 +f 1548 1462 1547 +f 1548 1464 1462 +f 1549 1464 1548 +f 1549 1466 1464 +f 1550 1466 1549 +f 1550 1468 1466 +f 1551 1468 1550 +f 1551 1470 1468 +f 1552 1470 1551 +f 1552 1472 1470 +f 1553 1472 1552 +f 1553 1474 1472 +f 1554 1474 1553 +f 1554 1476 1474 +f 1555 1476 1554 +f 1555 1478 1476 +f 1556 1478 1555 +f 1556 1480 1478 +f 1557 1480 1556 +f 1557 1482 1480 +f 1558 1482 1557 +f 1558 1484 1482 +f 1559 1484 1558 +f 1559 1486 1484 +f 1560 1486 1559 +f 1560 1488 1486 +f 1561 1488 1560 +f 1561 1490 1488 +f 1562 1490 1561 +f 1562 1492 1490 +f 1563 1492 1562 +f 1563 1494 1492 +f 1564 1494 1563 +f 1564 1496 1494 +f 1565 1496 1564 +f 1565 1498 1496 +f 1566 1498 1565 +f 1566 1500 1498 +f 1567 1500 1566 +f 1567 1502 1500 +f 1568 1502 1567 +f 1568 1504 1502 +f 1569 1504 1568 +f 1569 1506 1504 +f 1570 1506 1569 +f 1570 1508 1506 +f 1571 1508 1570 +f 1571 1510 1508 +f 1572 1510 1571 +f 1572 1512 1510 +f 1573 1512 1572 +f 1573 1514 1512 +f 1574 1514 1573 +f 1574 1516 1514 +f 1575 1516 1574 +f 1575 1518 1516 +f 1576 1518 1575 +f 1576 1521 1518 +f 1577 1521 1576 +f 1577 1522 1521 +f 1578 1522 1577 +f 1578 1524 1522 +f 1579 1524 1578 +f 1579 1526 1524 +f 1580 1526 1579 +f 1580 1528 1526 +f 1581 1528 1580 +f 1581 1530 1528 +f 1582 1530 1581 +f 1582 1532 1530 +f 1583 1532 1582 +f 1583 1534 1532 +f 1537 1534 1583 +f 1537 1441 1534 +f 1584 1537 1585 +f 1584 1536 1537 +f 1586 1536 1584 +f 1586 1538 1536 +f 1587 1538 1586 +f 1587 1539 1538 +f 1588 1539 1587 +f 1588 1540 1539 +f 1589 1540 1588 +f 1589 1541 1540 +f 1590 1541 1589 +f 1590 1542 1541 +f 1591 1542 1590 +f 1591 1543 1542 +f 1592 1543 1591 +f 1592 1544 1543 +f 1593 1544 1592 +f 1593 1545 1544 +f 1594 1545 1593 +f 1594 1546 1545 +f 1595 1546 1594 +f 1595 1547 1546 +f 1596 1547 1595 +f 1596 1548 1547 +f 1597 1548 1596 +f 1597 1549 1548 +f 1598 1549 1597 +f 1598 1550 1549 +f 1599 1550 1598 +f 1599 1551 1550 +f 1600 1551 1599 +f 1600 1552 1551 +f 1601 1552 1600 +f 1601 1553 1552 +f 1602 1553 1601 +f 1602 1554 1553 +f 1603 1554 1602 +f 1603 1555 1554 +f 1604 1555 1603 +f 1604 1556 1555 +f 1605 1556 1604 +f 1605 1557 1556 +f 1606 1557 1605 +f 1606 1558 1557 +f 1607 1558 1606 +f 1607 1559 1558 +f 1608 1559 1607 +f 1608 1560 1559 +f 1609 1560 1608 +f 1609 1561 1560 +f 1610 1561 1609 +f 1610 1562 1561 +f 1611 1562 1610 +f 1611 1563 1562 +f 1612 1563 1611 +f 1612 1564 1563 +f 1613 1564 1612 +f 1613 1565 1564 +f 1614 1565 1613 +f 1614 1566 1565 +f 1615 1566 1614 +f 1615 1567 1566 +f 1616 1567 1615 +f 1616 1568 1567 +f 1617 1568 1616 +f 1617 1569 1568 +f 1618 1569 1617 +f 1618 1570 1569 +f 1619 1570 1618 +f 1619 1571 1570 +f 1620 1571 1619 +f 1620 1572 1571 +f 1621 1572 1620 +f 1621 1573 1572 +f 1622 1573 1621 +f 1622 1574 1573 +f 1623 1574 1622 +f 1623 1575 1574 +f 1624 1575 1623 +f 1624 1576 1575 +f 1625 1576 1624 +f 1625 1577 1576 +f 1626 1577 1625 +f 1626 1578 1577 +f 1627 1578 1626 +f 1627 1579 1578 +f 1628 1579 1627 +f 1628 1580 1579 +f 1629 1580 1628 +f 1629 1581 1580 +f 1630 1581 1629 +f 1630 1582 1581 +f 1631 1582 1630 +f 1631 1583 1582 +f 1585 1583 1631 +f 1585 1537 1583 +f 1632 1585 1633 +f 1632 1584 1585 +f 1634 1584 1632 +f 1634 1586 1584 +f 1635 1586 1634 +f 1635 1587 1586 +f 1636 1587 1635 +f 1636 1588 1587 +f 1637 1588 1636 +f 1637 1589 1588 +f 1638 1589 1637 +f 1638 1590 1589 +f 1639 1590 1638 +f 1639 1591 1590 +f 1640 1591 1639 +f 1640 1592 1591 +f 1641 1592 1640 +f 1641 1593 1592 +f 1642 1593 1641 +f 1642 1594 1593 +f 1643 1594 1642 +f 1643 1595 1594 +f 1644 1595 1643 +f 1644 1596 1595 +f 1645 1596 1644 +f 1645 1597 1596 +f 1646 1597 1645 +f 1646 1598 1597 +f 1647 1598 1646 +f 1647 1599 1598 +f 1648 1599 1647 +f 1648 1600 1599 +f 1649 1600 1648 +f 1649 1601 1600 +f 1650 1601 1649 +f 1650 1602 1601 +f 1651 1602 1650 +f 1651 1603 1602 +f 1652 1603 1651 +f 1652 1604 1603 +f 1653 1604 1652 +f 1653 1605 1604 +f 1654 1605 1653 +f 1654 1606 1605 +f 1655 1606 1654 +f 1655 1607 1606 +f 1656 1607 1655 +f 1656 1608 1607 +f 1657 1608 1656 +f 1657 1609 1608 +f 1658 1609 1657 +f 1658 1610 1609 +f 1659 1610 1658 +f 1659 1611 1610 +f 1660 1611 1659 +f 1660 1612 1611 +f 1661 1612 1660 +f 1661 1613 1612 +f 1662 1613 1661 +f 1662 1614 1613 +f 1663 1614 1662 +f 1663 1615 1614 +f 1664 1615 1663 +f 1664 1616 1615 +f 1665 1616 1664 +f 1665 1617 1616 +f 1666 1617 1665 +f 1666 1618 1617 +f 1667 1618 1666 +f 1667 1619 1618 +f 1668 1619 1667 +f 1668 1620 1619 +f 1669 1620 1668 +f 1669 1621 1620 +f 1670 1621 1669 +f 1670 1622 1621 +f 1671 1622 1670 +f 1671 1623 1622 +f 1672 1623 1671 +f 1672 1624 1623 +f 1673 1624 1672 +f 1673 1625 1624 +f 1674 1625 1673 +f 1674 1626 1625 +f 1675 1626 1674 +f 1675 1627 1626 +f 1676 1627 1675 +f 1676 1628 1627 +f 1677 1628 1676 +f 1677 1629 1628 +f 1678 1629 1677 +f 1678 1630 1629 +f 1679 1630 1678 +f 1679 1631 1630 +f 1633 1631 1679 +f 1633 1585 1631 +f 1680 1633 1681 +f 1680 1632 1633 +f 1682 1632 1680 +f 1682 1634 1632 +f 1683 1634 1682 +f 1683 1635 1634 +f 1684 1635 1683 +f 1684 1636 1635 +f 1685 1636 1684 +f 1685 1637 1636 +f 1686 1637 1685 +f 1686 1638 1637 +f 1687 1638 1686 +f 1687 1639 1638 +f 1688 1639 1687 +f 1688 1640 1639 +f 1689 1640 1688 +f 1689 1641 1640 +f 1690 1641 1689 +f 1690 1642 1641 +f 1691 1642 1690 +f 1691 1643 1642 +f 1692 1643 1691 +f 1692 1644 1643 +f 1693 1644 1692 +f 1693 1645 1644 +f 1694 1645 1693 +f 1694 1646 1645 +f 1695 1646 1694 +f 1695 1647 1646 +f 1696 1647 1695 +f 1696 1648 1647 +f 1697 1648 1696 +f 1697 1649 1648 +f 1698 1649 1697 +f 1698 1650 1649 +f 1699 1650 1698 +f 1699 1651 1650 +f 1700 1651 1699 +f 1700 1652 1651 +f 1701 1652 1700 +f 1701 1653 1652 +f 1702 1653 1701 +f 1702 1654 1653 +f 1703 1654 1702 +f 1703 1655 1654 +f 1704 1655 1703 +f 1704 1656 1655 +f 1705 1656 1704 +f 1705 1657 1656 +f 1706 1657 1705 +f 1706 1658 1657 +f 1707 1658 1706 +f 1707 1659 1658 +f 1708 1659 1707 +f 1708 1660 1659 +f 1709 1660 1708 +f 1709 1661 1660 +f 1710 1661 1709 +f 1710 1662 1661 +f 1711 1662 1710 +f 1711 1663 1662 +f 1712 1663 1711 +f 1712 1664 1663 +f 1713 1664 1712 +f 1713 1665 1664 +f 1714 1665 1713 +f 1714 1666 1665 +f 1715 1666 1714 +f 1715 1667 1666 +f 1716 1667 1715 +f 1716 1668 1667 +f 1717 1668 1716 +f 1717 1669 1668 +f 1718 1669 1717 +f 1718 1670 1669 +f 1719 1670 1718 +f 1719 1671 1670 +f 1720 1671 1719 +f 1720 1672 1671 +f 1721 1672 1720 +f 1721 1673 1672 +f 1722 1673 1721 +f 1722 1674 1673 +f 1723 1674 1722 +f 1723 1675 1674 +f 1724 1675 1723 +f 1724 1676 1675 +f 1725 1676 1724 +f 1725 1677 1676 +f 1726 1677 1725 +f 1726 1678 1677 +f 1727 1678 1726 +f 1727 1679 1678 +f 1681 1679 1727 +f 1681 1633 1679 +f 1728 1681 1729 +f 1728 1680 1681 +f 1730 1680 1728 +f 1730 1682 1680 +f 1731 1682 1730 +f 1731 1683 1682 +f 1732 1683 1731 +f 1732 1684 1683 +f 1733 1684 1732 +f 1733 1685 1684 +f 1734 1685 1733 +f 1734 1686 1685 +f 1735 1686 1734 +f 1735 1687 1686 +f 1736 1687 1735 +f 1736 1688 1687 +f 1737 1688 1736 +f 1737 1689 1688 +f 1738 1689 1737 +f 1738 1690 1689 +f 1739 1690 1738 +f 1739 1691 1690 +f 1740 1691 1739 +f 1740 1692 1691 +f 1741 1692 1740 +f 1741 1693 1692 +f 1742 1693 1741 +f 1742 1694 1693 +f 1743 1694 1742 +f 1743 1695 1694 +f 1744 1695 1743 +f 1744 1696 1695 +f 1745 1696 1744 +f 1745 1697 1696 +f 1746 1697 1745 +f 1746 1698 1697 +f 1747 1698 1746 +f 1747 1699 1698 +f 1748 1699 1747 +f 1748 1700 1699 +f 1749 1700 1748 +f 1749 1701 1700 +f 1750 1701 1749 +f 1750 1702 1701 +f 1751 1702 1750 +f 1751 1703 1702 +f 1752 1703 1751 +f 1752 1704 1703 +f 1753 1704 1752 +f 1753 1705 1704 +f 1754 1705 1753 +f 1754 1706 1705 +f 1755 1706 1754 +f 1755 1707 1706 +f 1756 1707 1755 +f 1756 1708 1707 +f 1757 1708 1756 +f 1757 1709 1708 +f 1758 1709 1757 +f 1758 1710 1709 +f 1759 1710 1758 +f 1759 1711 1710 +f 1760 1711 1759 +f 1760 1712 1711 +f 1761 1712 1760 +f 1761 1713 1712 +f 1762 1713 1761 +f 1762 1714 1713 +f 1763 1714 1762 +f 1763 1715 1714 +f 1764 1715 1763 +f 1764 1716 1715 +f 1765 1716 1764 +f 1765 1717 1716 +f 1766 1717 1765 +f 1766 1718 1717 +f 1767 1718 1766 +f 1767 1719 1718 +f 1768 1719 1767 +f 1768 1720 1719 +f 1769 1720 1768 +f 1769 1721 1720 +f 1770 1721 1769 +f 1770 1722 1721 +f 1771 1722 1770 +f 1771 1723 1722 +f 1772 1723 1771 +f 1772 1724 1723 +f 1773 1724 1772 +f 1773 1725 1724 +f 1774 1725 1773 +f 1774 1726 1725 +f 1775 1726 1774 +f 1775 1727 1726 +f 1729 1727 1775 +f 1729 1681 1727 +f 1776 1777 165 +f 1778 1777 1776 +f 1779 1777 1778 +f 1779 1780 1777 +f 1781 1780 1779 +f 1781 1782 1780 +f 1783 1782 1781 +f 1783 1784 1782 +f 1785 1784 1783 +f 1785 1786 1784 +f 1787 1786 1785 +f 1787 1788 1786 +f 1789 1788 1787 +f 1789 1790 1788 +f 1791 1790 1789 +f 1791 1792 1790 +f 1793 1792 1791 +f 1793 1794 1792 +f 1795 1794 1793 +f 1795 1796 1794 +f 1795 1797 1796 +f 1798 1797 1795 +f 1799 1797 1798 +f 1799 1800 1797 +f 1801 1800 1799 +f 1801 1802 1800 +f 1801 1803 1802 +f 1804 1803 1801 +f 1805 1803 1804 +f 1805 1806 1803 +f 1807 1806 1805 +f 1807 1808 1806 +f 1809 1808 1807 +f 1809 1810 1808 +f 1811 1810 1809 +f 1811 1812 1810 +f 1813 1812 1811 +f 1813 1814 1812 +f 1815 1814 1813 +f 1815 1816 1814 +f 1817 1816 1815 +f 1817 1818 1816 +f 1819 1818 1817 +f 1819 1820 1818 +f 1821 1820 1819 +f 1821 1822 1820 +f 1823 1822 1821 +f 1823 181 1822 +f 1824 181 1823 +f 1824 1825 181 +f 1826 1825 1824 +f 1826 1827 1825 +f 1828 1827 1826 +f 1828 1829 1827 +f 1830 1829 1828 +f 1830 1831 1829 +f 1832 1831 1830 +f 1832 1833 1831 +f 1834 1833 1832 +f 1834 1835 1833 +f 1836 1835 1834 +f 1836 1837 1835 +f 1838 1837 1836 +f 1838 1839 1837 +f 1840 1839 1838 +f 1840 1841 1839 +f 1842 1841 1840 +f 1842 1843 1841 +f 1844 1843 1842 +f 1844 1845 1843 +f 1846 1845 1844 +f 1846 1847 1845 +f 1846 1848 1847 +f 1849 1848 1846 +f 1850 1848 1849 +f 1850 1851 1848 +f 1852 1851 1850 +f 1852 1853 1851 +f 1854 1853 1852 +f 1854 1855 1853 +f 1854 1856 1855 +f 1857 1856 1854 +f 1858 1856 1857 +f 1858 1859 1856 +f 1860 1859 1858 +f 1860 1861 1859 +f 1862 1861 1860 +f 1862 1863 1861 +f 1862 1864 1863 +f 1865 1864 1862 +f 1866 1864 1865 +f 1866 1867 1864 +f 1868 1867 1866 +f 1868 1869 1867 +f 1868 165 1869 +f 1776 165 1868 +f 1870 1776 1871 +f 1870 1778 1776 +f 1872 1778 1870 +f 1872 1779 1778 +f 1873 1779 1872 +f 1873 1781 1779 +f 1874 1781 1873 +f 1874 1783 1781 +f 1875 1783 1874 +f 1875 1785 1783 +f 1876 1785 1875 +f 1876 1787 1785 +f 1877 1787 1876 +f 1877 1789 1787 +f 1878 1789 1877 +f 1878 1791 1789 +f 1879 1791 1878 +f 1879 1793 1791 +f 1880 1793 1879 +f 1880 1795 1793 +f 1881 1795 1880 +f 1881 1798 1795 +f 1882 1798 1881 +f 1882 1799 1798 +f 1883 1799 1882 +f 1883 1801 1799 +f 1884 1801 1883 +f 1884 1804 1801 +f 1885 1804 1884 +f 1885 1805 1804 +f 1886 1805 1885 +f 1886 1807 1805 +f 1887 1807 1886 +f 1887 1809 1807 +f 1888 1809 1887 +f 1888 1811 1809 +f 1889 1811 1888 +f 1889 1813 1811 +f 1890 1813 1889 +f 1890 1815 1813 +f 1891 1815 1890 +f 1891 1817 1815 +f 1892 1817 1891 +f 1892 1819 1817 +f 1893 1819 1892 +f 1893 1821 1819 +f 1894 1821 1893 +f 1894 1823 1821 +f 1895 1823 1894 +f 1895 1824 1823 +f 1896 1824 1895 +f 1896 1826 1824 +f 1897 1826 1896 +f 1897 1828 1826 +f 1898 1828 1897 +f 1898 1830 1828 +f 1899 1830 1898 +f 1899 1832 1830 +f 1900 1832 1899 +f 1900 1834 1832 +f 1901 1834 1900 +f 1901 1836 1834 +f 1902 1836 1901 +f 1902 1838 1836 +f 1903 1838 1902 +f 1903 1840 1838 +f 1904 1840 1903 +f 1904 1842 1840 +f 1905 1842 1904 +f 1905 1844 1842 +f 1906 1844 1905 +f 1906 1846 1844 +f 1907 1846 1906 +f 1907 1849 1846 +f 1908 1849 1907 +f 1908 1850 1849 +f 1909 1850 1908 +f 1909 1852 1850 +f 1910 1852 1909 +f 1910 1854 1852 +f 1911 1854 1910 +f 1911 1857 1854 +f 1912 1857 1911 +f 1912 1858 1857 +f 1913 1858 1912 +f 1913 1860 1858 +f 1914 1860 1913 +f 1914 1862 1860 +f 1915 1862 1914 +f 1915 1865 1862 +f 1916 1865 1915 +f 1916 1866 1865 +f 1917 1866 1916 +f 1917 1868 1866 +f 1871 1868 1917 +f 1871 1776 1868 +f 1918 1871 1919 +f 1918 1870 1871 +f 1920 1870 1918 +f 1920 1872 1870 +f 1921 1872 1920 +f 1921 1873 1872 +f 1922 1873 1921 +f 1922 1874 1873 +f 1923 1874 1922 +f 1923 1875 1874 +f 1924 1875 1923 +f 1924 1876 1875 +f 1925 1876 1924 +f 1925 1877 1876 +f 1926 1877 1925 +f 1926 1878 1877 +f 1927 1878 1926 +f 1927 1879 1878 +f 1928 1879 1927 +f 1928 1880 1879 +f 1929 1880 1928 +f 1929 1881 1880 +f 1930 1881 1929 +f 1930 1882 1881 +f 1931 1882 1930 +f 1931 1883 1882 +f 1932 1883 1931 +f 1932 1884 1883 +f 1933 1884 1932 +f 1933 1885 1884 +f 1934 1885 1933 +f 1934 1886 1885 +f 1935 1886 1934 +f 1935 1887 1886 +f 1936 1887 1935 +f 1936 1888 1887 +f 1937 1888 1936 +f 1937 1889 1888 +f 1938 1889 1937 +f 1938 1890 1889 +f 1939 1890 1938 +f 1939 1891 1890 +f 1940 1891 1939 +f 1940 1892 1891 +f 1941 1892 1940 +f 1941 1893 1892 +f 1942 1893 1941 +f 1942 1894 1893 +f 1943 1894 1942 +f 1943 1895 1894 +f 1944 1895 1943 +f 1944 1896 1895 +f 1945 1896 1944 +f 1945 1897 1896 +f 1946 1897 1945 +f 1946 1898 1897 +f 1947 1898 1946 +f 1947 1899 1898 +f 1948 1899 1947 +f 1948 1900 1899 +f 1949 1900 1948 +f 1949 1901 1900 +f 1950 1901 1949 +f 1950 1902 1901 +f 1951 1902 1950 +f 1951 1903 1902 +f 1952 1903 1951 +f 1952 1904 1903 +f 1953 1904 1952 +f 1953 1905 1904 +f 1954 1905 1953 +f 1954 1906 1905 +f 1955 1906 1954 +f 1955 1907 1906 +f 1956 1907 1955 +f 1956 1908 1907 +f 1957 1908 1956 +f 1957 1909 1908 +f 1958 1909 1957 +f 1958 1910 1909 +f 1959 1910 1958 +f 1959 1911 1910 +f 1960 1911 1959 +f 1960 1912 1911 +f 1961 1912 1960 +f 1961 1913 1912 +f 1962 1913 1961 +f 1962 1914 1913 +f 1963 1914 1962 +f 1963 1915 1914 +f 1964 1915 1963 +f 1964 1916 1915 +f 1965 1916 1964 +f 1965 1917 1916 +f 1919 1917 1965 +f 1919 1871 1917 +f 1966 1919 1967 +f 1966 1918 1919 +f 1968 1918 1966 +f 1968 1920 1918 +f 1969 1920 1968 +f 1969 1921 1920 +f 1970 1921 1969 +f 1970 1922 1921 +f 1971 1922 1970 +f 1971 1923 1922 +f 1972 1923 1971 +f 1972 1924 1923 +f 1973 1924 1972 +f 1973 1925 1924 +f 1974 1925 1973 +f 1974 1926 1925 +f 1975 1926 1974 +f 1975 1927 1926 +f 1976 1927 1975 +f 1976 1928 1927 +f 1977 1928 1976 +f 1977 1929 1928 +f 1978 1929 1977 +f 1978 1930 1929 +f 1979 1930 1978 +f 1979 1931 1930 +f 1980 1931 1979 +f 1980 1932 1931 +f 1981 1932 1980 +f 1981 1933 1932 +f 1982 1933 1981 +f 1982 1934 1933 +f 1983 1934 1982 +f 1983 1935 1934 +f 1984 1935 1983 +f 1984 1936 1935 +f 1985 1936 1984 +f 1985 1937 1936 +f 1986 1937 1985 +f 1986 1938 1937 +f 1987 1938 1986 +f 1987 1939 1938 +f 1988 1939 1987 +f 1988 1940 1939 +f 1989 1940 1988 +f 1989 1941 1940 +f 1990 1941 1989 +f 1990 1942 1941 +f 1991 1942 1990 +f 1991 1943 1942 +f 1992 1943 1991 +f 1992 1944 1943 +f 1993 1944 1992 +f 1993 1945 1944 +f 1994 1945 1993 +f 1994 1946 1945 +f 1995 1946 1994 +f 1995 1947 1946 +f 1996 1947 1995 +f 1996 1948 1947 +f 1997 1948 1996 +f 1997 1949 1948 +f 1998 1949 1997 +f 1998 1950 1949 +f 1999 1950 1998 +f 1999 1951 1950 +f 2000 1951 1999 +f 2000 1952 1951 +f 2001 1952 2000 +f 2001 1953 1952 +f 2002 1953 2001 +f 2002 1954 1953 +f 2003 1954 2002 +f 2003 1955 1954 +f 2004 1955 2003 +f 2004 1956 1955 +f 2005 1956 2004 +f 2005 1957 1956 +f 2006 1957 2005 +f 2006 1958 1957 +f 2007 1958 2006 +f 2007 1959 1958 +f 2008 1959 2007 +f 2008 1960 1959 +f 2009 1960 2008 +f 2009 1961 1960 +f 2010 1961 2009 +f 2010 1962 1961 +f 2011 1962 2010 +f 2011 1963 1962 +f 2012 1963 2011 +f 2012 1964 1963 +f 2013 1964 2012 +f 2013 1965 1964 +f 1967 1965 2013 +f 1967 1919 1965 +f 2014 1967 2015 +f 2014 1966 1967 +f 2016 1966 2014 +f 2016 1968 1966 +f 2017 1968 2016 +f 2017 1969 1968 +f 2018 1969 2017 +f 2018 1970 1969 +f 2019 1970 2018 +f 2019 1971 1970 +f 2020 1971 2019 +f 2020 1972 1971 +f 2021 1972 2020 +f 2021 1973 1972 +f 2022 1973 2021 +f 2022 1974 1973 +f 2023 1974 2022 +f 2023 1975 1974 +f 2024 1975 2023 +f 2024 1976 1975 +f 2025 1976 2024 +f 2025 1977 1976 +f 2026 1977 2025 +f 2026 1978 1977 +f 2027 1978 2026 +f 2027 1979 1978 +f 2028 1979 2027 +f 2028 1980 1979 +f 2029 1980 2028 +f 2029 1981 1980 +f 2030 1981 2029 +f 2030 1982 1981 +f 2031 1982 2030 +f 2031 1983 1982 +f 2032 1983 2031 +f 2032 1984 1983 +f 2033 1984 2032 +f 2033 1985 1984 +f 2034 1985 2033 +f 2034 1986 1985 +f 2035 1986 2034 +f 2035 1987 1986 +f 2036 1987 2035 +f 2036 1988 1987 +f 2037 1988 2036 +f 2037 1989 1988 +f 2038 1989 2037 +f 2038 1990 1989 +f 2039 1990 2038 +f 2039 1991 1990 +f 2040 1991 2039 +f 2040 1992 1991 +f 2041 1992 2040 +f 2041 1993 1992 +f 2042 1993 2041 +f 2042 1994 1993 +f 2043 1994 2042 +f 2043 1995 1994 +f 2044 1995 2043 +f 2044 1996 1995 +f 2045 1996 2044 +f 2045 1997 1996 +f 2046 1997 2045 +f 2046 1998 1997 +f 2047 1998 2046 +f 2047 1999 1998 +f 2048 1999 2047 +f 2048 2000 1999 +f 2049 2000 2048 +f 2049 2001 2000 +f 2050 2001 2049 +f 2050 2002 2001 +f 2051 2002 2050 +f 2051 2003 2002 +f 2052 2003 2051 +f 2052 2004 2003 +f 2053 2004 2052 +f 2053 2005 2004 +f 2054 2005 2053 +f 2054 2006 2005 +f 2055 2006 2054 +f 2055 2007 2006 +f 2056 2007 2055 +f 2056 2008 2007 +f 2057 2008 2056 +f 2057 2009 2008 +f 2058 2009 2057 +f 2058 2010 2009 +f 2059 2010 2058 +f 2059 2011 2010 +f 2060 2011 2059 +f 2060 2012 2011 +f 2061 2012 2060 +f 2061 2013 2012 +f 2015 2013 2061 +f 2015 1967 2013 +f 2062 2015 2063 +f 2062 2014 2015 +f 2064 2014 2062 +f 2064 2016 2014 +f 2065 2016 2064 +f 2065 2017 2016 +f 2066 2017 2065 +f 2066 2018 2017 +f 2067 2018 2066 +f 2067 2019 2018 +f 2068 2019 2067 +f 2068 2020 2019 +f 2069 2020 2068 +f 2069 2021 2020 +f 2070 2021 2069 +f 2070 2022 2021 +f 2071 2022 2070 +f 2071 2023 2022 +f 2072 2023 2071 +f 2072 2024 2023 +f 2073 2024 2072 +f 2073 2025 2024 +f 2074 2025 2073 +f 2074 2026 2025 +f 2075 2026 2074 +f 2075 2027 2026 +f 2076 2027 2075 +f 2076 2028 2027 +f 2077 2028 2076 +f 2077 2029 2028 +f 2078 2029 2077 +f 2078 2030 2029 +f 2079 2030 2078 +f 2079 2031 2030 +f 2080 2031 2079 +f 2080 2032 2031 +f 2081 2032 2080 +f 2081 2033 2032 +f 2082 2033 2081 +f 2082 2034 2033 +f 2083 2034 2082 +f 2083 2035 2034 +f 2084 2035 2083 +f 2084 2036 2035 +f 2085 2036 2084 +f 2085 2037 2036 +f 2086 2037 2085 +f 2086 2038 2037 +f 2087 2038 2086 +f 2087 2039 2038 +f 2088 2039 2087 +f 2088 2040 2039 +f 2089 2040 2088 +f 2089 2041 2040 +f 2090 2041 2089 +f 2090 2042 2041 +f 2091 2042 2090 +f 2091 2043 2042 +f 2092 2043 2091 +f 2092 2044 2043 +f 2093 2044 2092 +f 2093 2045 2044 +f 2094 2045 2093 +f 2094 2046 2045 +f 2095 2046 2094 +f 2095 2047 2046 +f 2096 2047 2095 +f 2096 2048 2047 +f 2097 2048 2096 +f 2097 2049 2048 +f 2098 2049 2097 +f 2098 2050 2049 +f 2099 2050 2098 +f 2099 2051 2050 +f 2100 2051 2099 +f 2100 2052 2051 +f 2101 2052 2100 +f 2101 2053 2052 +f 2102 2053 2101 +f 2102 2054 2053 +f 2103 2054 2102 +f 2103 2055 2054 +f 2104 2055 2103 +f 2104 2056 2055 +f 2105 2056 2104 +f 2105 2057 2056 +f 2106 2057 2105 +f 2106 2058 2057 +f 2107 2058 2106 +f 2107 2059 2058 +f 2108 2059 2107 +f 2108 2060 2059 +f 2109 2060 2108 +f 2109 2061 2060 +f 2063 2061 2109 +f 2063 2015 2061 +f 2110 2111 309 +f 2112 2111 2110 +f 2113 2111 2112 +f 2113 2114 2111 +f 2115 2114 2113 +f 2115 2116 2114 +f 2117 2116 2115 +f 2117 2118 2116 +f 2119 2118 2117 +f 2119 2120 2118 +f 2121 2120 2119 +f 2121 2122 2120 +f 2123 2122 2121 +f 2123 2124 2122 +f 2125 2124 2123 +f 2125 2126 2124 +f 2127 2126 2125 +f 2127 2128 2126 +f 2127 2129 2128 +f 2130 2129 2127 +f 2131 2129 2130 +f 2131 2132 2129 +f 2133 2132 2131 +f 2133 2134 2132 +f 2135 2134 2133 +f 2135 2136 2134 +f 2137 2136 2135 +f 2137 2138 2136 +f 2139 2138 2137 +f 2139 2140 2138 +f 2141 2140 2139 +f 2141 2142 2140 +f 2143 2142 2141 +f 2143 2144 2142 +f 2145 2144 2143 +f 2145 2146 2144 +f 2147 2146 2145 +f 2147 2148 2146 +f 2149 2148 2147 +f 2149 2150 2148 +f 2151 2150 2149 +f 2151 2152 2150 +f 2153 2152 2151 +f 2153 2154 2152 +f 2155 2154 2153 +f 2155 2156 2154 +f 2157 2156 2155 +f 2157 2158 2156 +f 2159 2158 2157 +f 2159 2160 2158 +f 2161 2160 2159 +f 2161 2162 2160 +f 2163 2162 2161 +f 2163 2164 2162 +f 2165 2164 2163 +f 2165 2166 2164 +f 2167 2166 2165 +f 2167 2168 2166 +f 2169 2168 2167 +f 2169 2170 2168 +f 2171 2170 2169 +f 2171 2172 2170 +f 2173 2172 2171 +f 2173 2174 2172 +f 2175 2174 2173 +f 2175 2176 2174 +f 2177 2176 2175 +f 2177 2178 2176 +f 2179 2178 2177 +f 2179 2180 2178 +f 2181 2180 2179 +f 2181 2182 2180 +f 2183 2182 2181 +f 2183 2184 2182 +f 2185 2184 2183 +f 2185 2186 2184 +f 2187 2186 2185 +f 2187 2188 2186 +f 2187 2189 2188 +f 2190 2189 2187 +f 2190 2191 2189 +f 2192 2191 2190 +f 2193 2191 2192 +f 2193 2194 2191 +f 2195 2194 2193 +f 2195 2196 2194 +f 2197 2196 2195 +f 2197 2198 2196 +f 2199 2198 2197 +f 2199 2200 2198 +f 2199 2201 2200 +f 2202 2201 2199 +f 2202 2203 2201 +f 2204 2203 2202 +f 2110 2203 2204 +f 2110 309 2203 +f 2205 2110 2206 +f 2205 2112 2110 +f 2207 2112 2205 +f 2207 2113 2112 +f 2208 2113 2207 +f 2208 2115 2113 +f 2209 2115 2208 +f 2209 2117 2115 +f 2210 2117 2209 +f 2210 2119 2117 +f 2211 2119 2210 +f 2211 2121 2119 +f 2212 2121 2211 +f 2212 2123 2121 +f 2213 2123 2212 +f 2213 2125 2123 +f 2214 2125 2213 +f 2214 2127 2125 +f 2215 2127 2214 +f 2215 2130 2127 +f 2216 2130 2215 +f 2216 2131 2130 +f 2217 2131 2216 +f 2217 2133 2131 +f 2218 2133 2217 +f 2218 2135 2133 +f 2219 2135 2218 +f 2219 2137 2135 +f 2220 2137 2219 +f 2220 2139 2137 +f 2221 2139 2220 +f 2221 2141 2139 +f 2222 2141 2221 +f 2222 2143 2141 +f 2223 2143 2222 +f 2223 2145 2143 +f 2224 2145 2223 +f 2224 2147 2145 +f 2225 2147 2224 +f 2225 2149 2147 +f 2226 2149 2225 +f 2226 2151 2149 +f 2227 2151 2226 +f 2227 2153 2151 +f 2228 2153 2227 +f 2228 2155 2153 +f 2229 2155 2228 +f 2229 2157 2155 +f 2230 2157 2229 +f 2230 2159 2157 +f 2231 2159 2230 +f 2231 2161 2159 +f 2232 2161 2231 +f 2232 2163 2161 +f 2233 2163 2232 +f 2233 2165 2163 +f 2234 2165 2233 +f 2234 2167 2165 +f 2235 2167 2234 +f 2235 2169 2167 +f 2236 2169 2235 +f 2236 2171 2169 +f 2237 2171 2236 +f 2237 2173 2171 +f 2238 2173 2237 +f 2238 2175 2173 +f 2239 2175 2238 +f 2239 2177 2175 +f 2240 2177 2239 +f 2240 2179 2177 +f 2241 2179 2240 +f 2241 2181 2179 +f 2242 2181 2241 +f 2242 2183 2181 +f 2243 2183 2242 +f 2243 2185 2183 +f 2244 2185 2243 +f 2244 2187 2185 +f 2245 2187 2244 +f 2245 2190 2187 +f 2246 2190 2245 +f 2246 2192 2190 +f 2247 2192 2246 +f 2247 2193 2192 +f 2248 2193 2247 +f 2248 2195 2193 +f 2249 2195 2248 +f 2249 2197 2195 +f 2250 2197 2249 +f 2250 2199 2197 +f 2251 2199 2250 +f 2251 2202 2199 +f 2252 2202 2251 +f 2252 2204 2202 +f 2206 2204 2252 +f 2206 2110 2204 +f 2253 2206 2254 +f 2253 2205 2206 +f 2255 2205 2253 +f 2255 2207 2205 +f 2256 2207 2255 +f 2256 2208 2207 +f 2257 2208 2256 +f 2257 2209 2208 +f 2258 2209 2257 +f 2258 2210 2209 +f 2259 2210 2258 +f 2259 2211 2210 +f 2260 2211 2259 +f 2260 2212 2211 +f 2261 2212 2260 +f 2261 2213 2212 +f 2262 2213 2261 +f 2262 2214 2213 +f 2263 2214 2262 +f 2263 2215 2214 +f 2264 2215 2263 +f 2264 2216 2215 +f 2265 2216 2264 +f 2265 2217 2216 +f 2266 2217 2265 +f 2266 2218 2217 +f 2267 2218 2266 +f 2267 2219 2218 +f 2268 2219 2267 +f 2268 2220 2219 +f 2269 2220 2268 +f 2269 2221 2220 +f 2270 2221 2269 +f 2270 2222 2221 +f 2271 2222 2270 +f 2271 2223 2222 +f 2272 2223 2271 +f 2272 2224 2223 +f 2273 2224 2272 +f 2273 2225 2224 +f 2274 2225 2273 +f 2274 2226 2225 +f 2275 2226 2274 +f 2275 2227 2226 +f 2276 2227 2275 +f 2276 2228 2227 +f 2277 2228 2276 +f 2277 2229 2228 +f 2278 2229 2277 +f 2278 2230 2229 +f 2279 2230 2278 +f 2279 2231 2230 +f 2280 2231 2279 +f 2280 2232 2231 +f 2281 2232 2280 +f 2281 2233 2232 +f 2282 2233 2281 +f 2282 2234 2233 +f 2283 2234 2282 +f 2283 2235 2234 +f 2284 2235 2283 +f 2284 2236 2235 +f 2285 2236 2284 +f 2285 2237 2236 +f 2286 2237 2285 +f 2286 2238 2237 +f 2287 2238 2286 +f 2287 2239 2238 +f 2288 2239 2287 +f 2288 2240 2239 +f 2289 2240 2288 +f 2289 2241 2240 +f 2290 2241 2289 +f 2290 2242 2241 +f 2291 2242 2290 +f 2291 2243 2242 +f 2292 2243 2291 +f 2292 2244 2243 +f 2293 2244 2292 +f 2293 2245 2244 +f 2294 2245 2293 +f 2294 2246 2245 +f 2295 2246 2294 +f 2295 2247 2246 +f 2296 2247 2295 +f 2296 2248 2247 +f 2297 2248 2296 +f 2297 2249 2248 +f 2298 2249 2297 +f 2298 2250 2249 +f 2299 2250 2298 +f 2299 2251 2250 +f 2300 2251 2299 +f 2300 2252 2251 +f 2254 2252 2300 +f 2254 2206 2252 +f 2301 2254 2302 +f 2301 2253 2254 +f 2303 2253 2301 +f 2303 2255 2253 +f 2304 2255 2303 +f 2304 2256 2255 +f 2305 2256 2304 +f 2305 2257 2256 +f 2306 2257 2305 +f 2306 2258 2257 +f 2307 2258 2306 +f 2307 2259 2258 +f 2308 2259 2307 +f 2308 2260 2259 +f 2309 2260 2308 +f 2309 2261 2260 +f 2310 2261 2309 +f 2310 2262 2261 +f 2311 2262 2310 +f 2311 2263 2262 +f 2312 2263 2311 +f 2312 2264 2263 +f 2313 2264 2312 +f 2313 2265 2264 +f 2314 2265 2313 +f 2314 2266 2265 +f 2315 2266 2314 +f 2315 2267 2266 +f 2316 2267 2315 +f 2316 2268 2267 +f 2317 2268 2316 +f 2317 2269 2268 +f 2318 2269 2317 +f 2318 2270 2269 +f 2319 2270 2318 +f 2319 2271 2270 +f 2320 2271 2319 +f 2320 2272 2271 +f 2321 2272 2320 +f 2321 2273 2272 +f 2322 2273 2321 +f 2322 2274 2273 +f 2323 2274 2322 +f 2323 2275 2274 +f 2324 2275 2323 +f 2324 2276 2275 +f 2325 2276 2324 +f 2325 2277 2276 +f 2326 2277 2325 +f 2326 2278 2277 +f 2327 2278 2326 +f 2327 2279 2278 +f 2328 2279 2327 +f 2328 2280 2279 +f 2329 2280 2328 +f 2329 2281 2280 +f 2330 2281 2329 +f 2330 2282 2281 +f 2331 2282 2330 +f 2331 2283 2282 +f 2332 2283 2331 +f 2332 2284 2283 +f 2333 2284 2332 +f 2333 2285 2284 +f 2334 2285 2333 +f 2334 2286 2285 +f 2335 2286 2334 +f 2335 2287 2286 +f 2336 2287 2335 +f 2336 2288 2287 +f 2337 2288 2336 +f 2337 2289 2288 +f 2338 2289 2337 +f 2338 2290 2289 +f 2339 2290 2338 +f 2339 2291 2290 +f 2340 2291 2339 +f 2340 2292 2291 +f 2341 2292 2340 +f 2341 2293 2292 +f 2342 2293 2341 +f 2342 2294 2293 +f 2343 2294 2342 +f 2343 2295 2294 +f 2344 2295 2343 +f 2344 2296 2295 +f 2345 2296 2344 +f 2345 2297 2296 +f 2346 2297 2345 +f 2346 2298 2297 +f 2347 2298 2346 +f 2347 2299 2298 +f 2348 2299 2347 +f 2348 2300 2299 +f 2302 2300 2348 +f 2302 2254 2300 +f 2349 2302 2350 +f 2349 2301 2302 +f 2351 2301 2349 +f 2351 2303 2301 +f 2352 2303 2351 +f 2352 2304 2303 +f 2353 2304 2352 +f 2353 2305 2304 +f 2354 2305 2353 +f 2354 2306 2305 +f 2355 2306 2354 +f 2355 2307 2306 +f 2356 2307 2355 +f 2356 2308 2307 +f 2357 2308 2356 +f 2357 2309 2308 +f 2358 2309 2357 +f 2358 2310 2309 +f 2359 2310 2358 +f 2359 2311 2310 +f 2360 2311 2359 +f 2360 2312 2311 +f 2361 2312 2360 +f 2361 2313 2312 +f 2362 2313 2361 +f 2362 2314 2313 +f 2363 2314 2362 +f 2363 2315 2314 +f 2364 2315 2363 +f 2364 2316 2315 +f 2365 2316 2364 +f 2365 2317 2316 +f 2366 2317 2365 +f 2366 2318 2317 +f 2367 2318 2366 +f 2367 2319 2318 +f 2368 2319 2367 +f 2368 2320 2319 +f 2369 2320 2368 +f 2369 2321 2320 +f 2370 2321 2369 +f 2370 2322 2321 +f 2371 2322 2370 +f 2371 2323 2322 +f 2372 2323 2371 +f 2372 2324 2323 +f 2373 2324 2372 +f 2373 2325 2324 +f 2374 2325 2373 +f 2374 2326 2325 +f 2375 2326 2374 +f 2375 2327 2326 +f 2376 2327 2375 +f 2376 2328 2327 +f 2377 2328 2376 +f 2377 2329 2328 +f 2378 2329 2377 +f 2378 2330 2329 +f 2379 2330 2378 +f 2379 2331 2330 +f 2380 2331 2379 +f 2380 2332 2331 +f 2381 2332 2380 +f 2381 2333 2332 +f 2382 2333 2381 +f 2382 2334 2333 +f 2383 2334 2382 +f 2383 2335 2334 +f 2384 2335 2383 +f 2384 2336 2335 +f 2385 2336 2384 +f 2385 2337 2336 +f 2386 2337 2385 +f 2386 2338 2337 +f 2387 2338 2386 +f 2387 2339 2338 +f 2388 2339 2387 +f 2388 2340 2339 +f 2389 2340 2388 +f 2389 2341 2340 +f 2390 2341 2389 +f 2390 2342 2341 +f 2391 2342 2390 +f 2391 2343 2342 +f 2392 2343 2391 +f 2392 2344 2343 +f 2393 2344 2392 +f 2393 2345 2344 +f 2394 2345 2393 +f 2394 2346 2345 +f 2395 2346 2394 +f 2395 2347 2346 +f 2396 2347 2395 +f 2396 2348 2347 +f 2350 2348 2396 +f 2350 2302 2348 +f 2397 2350 2398 +f 2397 2349 2350 +f 2399 2349 2397 +f 2399 2351 2349 +f 2400 2351 2399 +f 2400 2352 2351 +f 2401 2352 2400 +f 2401 2353 2352 +f 2402 2353 2401 +f 2402 2354 2353 +f 2403 2354 2402 +f 2403 2355 2354 +f 2404 2355 2403 +f 2404 2356 2355 +f 2405 2356 2404 +f 2405 2357 2356 +f 2406 2357 2405 +f 2406 2358 2357 +f 2407 2358 2406 +f 2407 2359 2358 +f 2408 2359 2407 +f 2408 2360 2359 +f 2409 2360 2408 +f 2409 2361 2360 +f 2410 2361 2409 +f 2410 2362 2361 +f 2411 2362 2410 +f 2411 2363 2362 +f 2412 2363 2411 +f 2412 2364 2363 +f 2413 2364 2412 +f 2413 2365 2364 +f 2414 2365 2413 +f 2414 2366 2365 +f 2415 2366 2414 +f 2415 2367 2366 +f 2416 2367 2415 +f 2416 2368 2367 +f 2417 2368 2416 +f 2417 2369 2368 +f 2418 2369 2417 +f 2418 2370 2369 +f 2419 2370 2418 +f 2419 2371 2370 +f 2420 2371 2419 +f 2420 2372 2371 +f 2421 2372 2420 +f 2421 2373 2372 +f 2422 2373 2421 +f 2422 2374 2373 +f 2423 2374 2422 +f 2423 2375 2374 +f 2424 2375 2423 +f 2424 2376 2375 +f 2425 2376 2424 +f 2425 2377 2376 +f 2426 2377 2425 +f 2426 2378 2377 +f 2427 2378 2426 +f 2427 2379 2378 +f 2428 2379 2427 +f 2428 2380 2379 +f 2429 2380 2428 +f 2429 2381 2380 +f 2430 2381 2429 +f 2430 2382 2381 +f 2431 2382 2430 +f 2431 2383 2382 +f 2432 2383 2431 +f 2432 2384 2383 +f 2433 2384 2432 +f 2433 2385 2384 +f 2434 2385 2433 +f 2434 2386 2385 +f 2435 2386 2434 +f 2435 2387 2386 +f 2436 2387 2435 +f 2436 2388 2387 +f 2437 2388 2436 +f 2437 2389 2388 +f 2438 2389 2437 +f 2438 2390 2389 +f 2439 2390 2438 +f 2439 2391 2390 +f 2440 2391 2439 +f 2440 2392 2391 +f 2441 2392 2440 +f 2441 2393 2392 +f 2442 2393 2441 +f 2442 2394 2393 +f 2443 2394 2442 +f 2443 2395 2394 +f 2444 2395 2443 +f 2444 2396 2395 +f 2398 2396 2444 +f 2398 2350 2396 +f 2445 2398 2446 +f 2445 2397 2398 +f 2447 2397 2445 +f 2447 2399 2397 +f 2448 2399 2447 +f 2448 2400 2399 +f 2449 2400 2448 +f 2449 2401 2400 +f 2450 2401 2449 +f 2450 2402 2401 +f 2451 2402 2450 +f 2451 2403 2402 +f 2452 2403 2451 +f 2452 2404 2403 +f 2453 2404 2452 +f 2453 2405 2404 +f 2454 2405 2453 +f 2454 2406 2405 +f 2455 2406 2454 +f 2455 2407 2406 +f 2456 2407 2455 +f 2456 2408 2407 +f 2457 2408 2456 +f 2457 2409 2408 +f 2458 2409 2457 +f 2458 2410 2409 +f 2459 2410 2458 +f 2459 2411 2410 +f 2460 2411 2459 +f 2460 2412 2411 +f 2461 2412 2460 +f 2461 2413 2412 +f 2462 2413 2461 +f 2462 2414 2413 +f 2463 2414 2462 +f 2463 2415 2414 +f 2464 2415 2463 +f 2464 2416 2415 +f 2465 2416 2464 +f 2465 2417 2416 +f 2465 2418 2417 +f 2466 2418 2465 +f 2467 2418 2466 +f 2467 2419 2418 +f 2468 2419 2467 +f 2468 2420 2419 +f 2469 2420 2468 +f 2469 2421 2420 +f 2470 2421 2469 +f 2470 2422 2421 +f 2471 2422 2470 +f 2471 2423 2422 +f 2471 2424 2423 +f 2472 2424 2471 +f 2473 2424 2472 +f 2473 2425 2424 +f 2474 2425 2473 +f 2474 2426 2425 +f 2475 2426 2474 +f 2475 2427 2426 +f 2476 2427 2475 +f 2476 2428 2427 +f 2477 2428 2476 +f 2477 2429 2428 +f 2478 2429 2477 +f 2478 2430 2429 +f 2478 2431 2430 +f 2479 2431 2478 +f 2480 2431 2479 +f 2480 2432 2431 +f 2481 2432 2480 +f 2481 2433 2432 +f 2482 2433 2481 +f 2482 2434 2433 +f 2483 2434 2482 +f 2483 2435 2434 +f 2484 2435 2483 +f 2484 2436 2435 +f 2485 2436 2484 +f 2485 2437 2436 +f 2486 2437 2485 +f 2486 2438 2437 +f 2486 2439 2438 +f 2487 2439 2486 +f 2488 2439 2487 +f 2488 2440 2439 +f 2489 2440 2488 +f 2489 2441 2440 +f 2490 2441 2489 +f 2490 2442 2441 +f 2491 2442 2490 +f 2491 2443 2442 +f 2492 2443 2491 +f 2492 2444 2443 +f 2492 2398 2444 +f 2446 2398 2492 +f 2493 453 2494 +f 2493 2495 453 +f 2496 2495 2493 +f 2496 2497 2495 +f 2498 2497 2496 +f 2498 2499 2497 +f 2500 2499 2498 +f 2500 2501 2499 +f 2502 2501 2500 +f 2502 2503 2501 +f 2504 2503 2502 +f 2504 2505 2503 +f 2504 2506 2505 +f 2507 2506 2504 +f 2507 2508 2506 +f 2509 2508 2507 +f 2510 2508 2509 +f 2510 2511 2508 +f 2512 2511 2510 +f 2512 2513 2511 +f 2514 2513 2512 +f 2514 2515 2513 +f 2516 2515 2514 +f 2516 2517 2515 +f 2518 2517 2516 +f 2518 2519 2517 +f 2520 2519 2518 +f 2520 2521 2519 +f 2522 2521 2520 +f 2522 2523 2521 +f 2524 2523 2522 +f 2524 2525 2523 +f 2526 2525 2524 +f 2526 2527 2525 +f 2528 2527 2526 +f 2528 2529 2527 +f 2530 2529 2528 +f 2530 2531 2529 +f 2532 2531 2530 +f 2532 2533 2531 +f 2534 2533 2532 +f 2534 2535 2533 +f 2536 2535 2534 +f 2536 2537 2535 +f 2538 2537 2536 +f 2538 2539 2537 +f 2540 2539 2538 +f 2540 2541 2539 +f 2542 2541 2540 +f 2542 2543 2541 +f 2544 2543 2542 +f 2544 2545 2543 +f 2546 2545 2544 +f 2546 2547 2545 +f 2548 2547 2546 +f 2548 2549 2547 +f 2550 2549 2548 +f 2550 2551 2549 +f 2552 2551 2550 +f 2552 2553 2551 +f 2554 2553 2552 +f 2554 2555 2553 +f 2556 2555 2554 +f 2556 2557 2555 +f 2558 2557 2556 +f 2558 2559 2557 +f 2560 2559 2558 +f 2560 2561 2559 +f 2562 2561 2560 +f 2562 2563 2561 +f 2564 2563 2562 +f 2564 2565 2563 +f 2566 2565 2564 +f 2566 2567 2565 +f 2568 2567 2566 +f 2568 2569 2567 +f 2570 2569 2568 +f 2570 2571 2569 +f 2572 2571 2570 +f 2572 2573 2571 +f 2574 2573 2572 +f 2574 2575 2573 +f 2576 2575 2574 +f 2576 2577 2575 +f 2576 2578 2577 +f 2579 2578 2576 +f 2580 2578 2579 +f 2580 2581 2578 +f 2580 2582 2581 +f 2583 2582 2580 +f 2584 2582 2583 +f 2584 2585 2582 +f 2586 2585 2584 +f 2586 2587 2585 +f 2494 2587 2586 +f 2494 453 2587 +f 2588 2494 2589 +f 2588 2493 2494 +f 2590 2493 2588 +f 2590 2496 2493 +f 2591 2496 2590 +f 2591 2498 2496 +f 2592 2498 2591 +f 2592 2500 2498 +f 2593 2500 2592 +f 2593 2502 2500 +f 2594 2502 2593 +f 2594 2504 2502 +f 2595 2504 2594 +f 2595 2507 2504 +f 2596 2507 2595 +f 2596 2509 2507 +f 2597 2509 2596 +f 2597 2510 2509 +f 2598 2510 2597 +f 2598 2512 2510 +f 2599 2512 2598 +f 2599 2514 2512 +f 2600 2514 2599 +f 2600 2516 2514 +f 2601 2516 2600 +f 2601 2518 2516 +f 2602 2518 2601 +f 2602 2520 2518 +f 2603 2520 2602 +f 2603 2522 2520 +f 2604 2522 2603 +f 2604 2524 2522 +f 2605 2524 2604 +f 2605 2526 2524 +f 2606 2526 2605 +f 2606 2528 2526 +f 2607 2528 2606 +f 2607 2530 2528 +f 2608 2530 2607 +f 2608 2532 2530 +f 2609 2532 2608 +f 2609 2534 2532 +f 2610 2534 2609 +f 2610 2536 2534 +f 2611 2536 2610 +f 2611 2538 2536 +f 2612 2538 2611 +f 2612 2540 2538 +f 2613 2540 2612 +f 2613 2542 2540 +f 2614 2542 2613 +f 2614 2544 2542 +f 2615 2544 2614 +f 2615 2546 2544 +f 2616 2546 2615 +f 2616 2548 2546 +f 2617 2548 2616 +f 2617 2550 2548 +f 2618 2550 2617 +f 2618 2552 2550 +f 2619 2552 2618 +f 2619 2554 2552 +f 2620 2554 2619 +f 2620 2556 2554 +f 2621 2556 2620 +f 2621 2558 2556 +f 2622 2558 2621 +f 2622 2560 2558 +f 2623 2560 2622 +f 2623 2562 2560 +f 2624 2562 2623 +f 2624 2564 2562 +f 2625 2564 2624 +f 2625 2566 2564 +f 2626 2566 2625 +f 2626 2568 2566 +f 2627 2568 2626 +f 2627 2570 2568 +f 2628 2570 2627 +f 2628 2572 2570 +f 2629 2572 2628 +f 2629 2574 2572 +f 2630 2574 2629 +f 2630 2576 2574 +f 2631 2576 2630 +f 2631 2579 2576 +f 2632 2579 2631 +f 2632 2580 2579 +f 2633 2580 2632 +f 2633 2583 2580 +f 2634 2583 2633 +f 2634 2584 2583 +f 2635 2584 2634 +f 2635 2586 2584 +f 2589 2586 2635 +f 2589 2494 2586 +f 2636 2589 2637 +f 2636 2588 2589 +f 2638 2588 2636 +f 2638 2590 2588 +f 2639 2590 2638 +f 2639 2591 2590 +f 2640 2591 2639 +f 2640 2592 2591 +f 2641 2592 2640 +f 2641 2593 2592 +f 2642 2593 2641 +f 2642 2594 2593 +f 2643 2594 2642 +f 2643 2595 2594 +f 2644 2595 2643 +f 2644 2596 2595 +f 2645 2596 2644 +f 2645 2597 2596 +f 2646 2597 2645 +f 2646 2598 2597 +f 2647 2598 2646 +f 2647 2599 2598 +f 2648 2599 2647 +f 2648 2600 2599 +f 2649 2600 2648 +f 2649 2601 2600 +f 2650 2601 2649 +f 2650 2602 2601 +f 2651 2602 2650 +f 2651 2603 2602 +f 2652 2603 2651 +f 2652 2604 2603 +f 2653 2604 2652 +f 2653 2605 2604 +f 2654 2605 2653 +f 2654 2606 2605 +f 2655 2606 2654 +f 2655 2607 2606 +f 2656 2607 2655 +f 2656 2608 2607 +f 2657 2608 2656 +f 2657 2609 2608 +f 2658 2609 2657 +f 2658 2610 2609 +f 2659 2610 2658 +f 2659 2611 2610 +f 2660 2611 2659 +f 2660 2612 2611 +f 2661 2612 2660 +f 2661 2613 2612 +f 2662 2613 2661 +f 2662 2614 2613 +f 2663 2614 2662 +f 2663 2615 2614 +f 2664 2615 2663 +f 2664 2616 2615 +f 2665 2616 2664 +f 2665 2617 2616 +f 2666 2617 2665 +f 2666 2618 2617 +f 2667 2618 2666 +f 2667 2619 2618 +f 2668 2619 2667 +f 2668 2620 2619 +f 2669 2620 2668 +f 2669 2621 2620 +f 2670 2621 2669 +f 2670 2622 2621 +f 2671 2622 2670 +f 2671 2623 2622 +f 2672 2623 2671 +f 2672 2624 2623 +f 2673 2624 2672 +f 2673 2625 2624 +f 2674 2625 2673 +f 2674 2626 2625 +f 2675 2626 2674 +f 2675 2627 2626 +f 2676 2627 2675 +f 2676 2628 2627 +f 2677 2628 2676 +f 2677 2629 2628 +f 2678 2629 2677 +f 2678 2630 2629 +f 2679 2630 2678 +f 2679 2631 2630 +f 2680 2631 2679 +f 2680 2632 2631 +f 2681 2632 2680 +f 2681 2633 2632 +f 2682 2633 2681 +f 2682 2634 2633 +f 2683 2634 2682 +f 2683 2635 2634 +f 2637 2635 2683 +f 2637 2589 2635 +f 2684 2637 2685 +f 2684 2636 2637 +f 2686 2636 2684 +f 2686 2638 2636 +f 2687 2638 2686 +f 2687 2639 2638 +f 2688 2639 2687 +f 2688 2640 2639 +f 2689 2640 2688 +f 2689 2641 2640 +f 2690 2641 2689 +f 2690 2642 2641 +f 2691 2642 2690 +f 2691 2643 2642 +f 2692 2643 2691 +f 2692 2644 2643 +f 2693 2644 2692 +f 2693 2645 2644 +f 2694 2645 2693 +f 2694 2646 2645 +f 2695 2646 2694 +f 2695 2647 2646 +f 2696 2647 2695 +f 2696 2648 2647 +f 2697 2648 2696 +f 2697 2649 2648 +f 2698 2649 2697 +f 2698 2650 2649 +f 2699 2650 2698 +f 2699 2651 2650 +f 2700 2651 2699 +f 2700 2652 2651 +f 2701 2652 2700 +f 2701 2653 2652 +f 2702 2653 2701 +f 2702 2654 2653 +f 2703 2654 2702 +f 2703 2655 2654 +f 2704 2655 2703 +f 2704 2656 2655 +f 2705 2656 2704 +f 2705 2657 2656 +f 2706 2657 2705 +f 2706 2658 2657 +f 2707 2658 2706 +f 2707 2659 2658 +f 2708 2659 2707 +f 2708 2660 2659 +f 2709 2660 2708 +f 2709 2661 2660 +f 2710 2661 2709 +f 2710 2662 2661 +f 2711 2662 2710 +f 2711 2663 2662 +f 2712 2663 2711 +f 2712 2664 2663 +f 2713 2664 2712 +f 2713 2665 2664 +f 2714 2665 2713 +f 2714 2666 2665 +f 2715 2666 2714 +f 2715 2667 2666 +f 2716 2667 2715 +f 2716 2668 2667 +f 2717 2668 2716 +f 2717 2669 2668 +f 2718 2669 2717 +f 2718 2670 2669 +f 2719 2670 2718 +f 2719 2671 2670 +f 2720 2671 2719 +f 2720 2672 2671 +f 2721 2672 2720 +f 2721 2673 2672 +f 2722 2673 2721 +f 2722 2674 2673 +f 2723 2674 2722 +f 2723 2675 2674 +f 2724 2675 2723 +f 2724 2676 2675 +f 2725 2676 2724 +f 2725 2677 2676 +f 2726 2677 2725 +f 2726 2678 2677 +f 2727 2678 2726 +f 2727 2679 2678 +f 2728 2679 2727 +f 2728 2680 2679 +f 2729 2680 2728 +f 2729 2681 2680 +f 2730 2681 2729 +f 2730 2682 2681 +f 2731 2682 2730 +f 2731 2683 2682 +f 2685 2683 2731 +f 2685 2637 2683 +f 2732 2685 2733 +f 2732 2684 2685 +f 2734 2684 2732 +f 2734 2686 2684 +f 2735 2686 2734 +f 2735 2687 2686 +f 2736 2687 2735 +f 2736 2688 2687 +f 2737 2688 2736 +f 2737 2689 2688 +f 2738 2689 2737 +f 2738 2690 2689 +f 2739 2690 2738 +f 2739 2691 2690 +f 2740 2691 2739 +f 2740 2692 2691 +f 2741 2692 2740 +f 2741 2693 2692 +f 2742 2693 2741 +f 2742 2694 2693 +f 2743 2694 2742 +f 2743 2695 2694 +f 2744 2695 2743 +f 2744 2696 2695 +f 2745 2696 2744 +f 2745 2697 2696 +f 2746 2697 2745 +f 2746 2698 2697 +f 2747 2698 2746 +f 2747 2699 2698 +f 2748 2699 2747 +f 2748 2700 2699 +f 2749 2700 2748 +f 2749 2701 2700 +f 2750 2701 2749 +f 2750 2702 2701 +f 2751 2702 2750 +f 2751 2703 2702 +f 2752 2703 2751 +f 2752 2704 2703 +f 2753 2704 2752 +f 2753 2705 2704 +f 2754 2705 2753 +f 2754 2706 2705 +f 2755 2706 2754 +f 2755 2707 2706 +f 2756 2707 2755 +f 2756 2708 2707 +f 2757 2708 2756 +f 2757 2709 2708 +f 2758 2709 2757 +f 2758 2710 2709 +f 2759 2710 2758 +f 2759 2711 2710 +f 2760 2711 2759 +f 2760 2712 2711 +f 2761 2712 2760 +f 2761 2713 2712 +f 2762 2713 2761 +f 2762 2714 2713 +f 2763 2714 2762 +f 2763 2715 2714 +f 2764 2715 2763 +f 2764 2716 2715 +f 2765 2716 2764 +f 2765 2717 2716 +f 2766 2717 2765 +f 2766 2718 2717 +f 2767 2718 2766 +f 2767 2719 2718 +f 2768 2719 2767 +f 2768 2720 2719 +f 2769 2720 2768 +f 2769 2721 2720 +f 2770 2721 2769 +f 2770 2722 2721 +f 2771 2722 2770 +f 2771 2723 2722 +f 2772 2723 2771 +f 2772 2724 2723 +f 2773 2724 2772 +f 2773 2725 2724 +f 2774 2725 2773 +f 2774 2726 2725 +f 2775 2726 2774 +f 2775 2727 2726 +f 2776 2727 2775 +f 2776 2728 2727 +f 2777 2728 2776 +f 2777 2729 2728 +f 2778 2729 2777 +f 2778 2730 2729 +f 2779 2730 2778 +f 2779 2731 2730 +f 2733 2731 2779 +f 2733 2685 2731 +f 2780 2733 2781 +f 2780 2732 2733 +f 2782 2732 2780 +f 2782 2734 2732 +f 2783 2734 2782 +f 2783 2735 2734 +f 2784 2735 2783 +f 2784 2736 2735 +f 2785 2736 2784 +f 2785 2737 2736 +f 2786 2737 2785 +f 2786 2738 2737 +f 2787 2738 2786 +f 2787 2739 2738 +f 2788 2739 2787 +f 2788 2740 2739 +f 2789 2740 2788 +f 2789 2741 2740 +f 2790 2741 2789 +f 2790 2742 2741 +f 2791 2742 2790 +f 2791 2743 2742 +f 2792 2743 2791 +f 2792 2744 2743 +f 2793 2744 2792 +f 2793 2745 2744 +f 2794 2745 2793 +f 2794 2746 2745 +f 2795 2746 2794 +f 2795 2747 2746 +f 2796 2747 2795 +f 2796 2748 2747 +f 2797 2748 2796 +f 2797 2749 2748 +f 2798 2749 2797 +f 2798 2750 2749 +f 2799 2750 2798 +f 2799 2751 2750 +f 2800 2751 2799 +f 2800 2752 2751 +f 2801 2752 2800 +f 2801 2753 2752 +f 2802 2753 2801 +f 2802 2754 2753 +f 2803 2754 2802 +f 2803 2755 2754 +f 2804 2755 2803 +f 2804 2756 2755 +f 2805 2756 2804 +f 2805 2757 2756 +f 2806 2757 2805 +f 2806 2758 2757 +f 2807 2758 2806 +f 2807 2759 2758 +f 2808 2759 2807 +f 2808 2760 2759 +f 2809 2760 2808 +f 2809 2761 2760 +f 2810 2761 2809 +f 2810 2762 2761 +f 2811 2762 2810 +f 2811 2763 2762 +f 2812 2763 2811 +f 2812 2764 2763 +f 2813 2764 2812 +f 2813 2765 2764 +f 2814 2765 2813 +f 2814 2766 2765 +f 2815 2766 2814 +f 2815 2767 2766 +f 2816 2767 2815 +f 2816 2768 2767 +f 2817 2768 2816 +f 2817 2769 2768 +f 2818 2769 2817 +f 2818 2770 2769 +f 2819 2770 2818 +f 2819 2771 2770 +f 2820 2771 2819 +f 2820 2772 2771 +f 2821 2772 2820 +f 2821 2773 2772 +f 2822 2773 2821 +f 2822 2774 2773 +f 2823 2774 2822 +f 2823 2775 2774 +f 2824 2775 2823 +f 2824 2776 2775 +f 2825 2776 2824 +f 2825 2777 2776 +f 2826 2777 2825 +f 2826 2778 2777 +f 2827 2778 2826 +f 2827 2779 2778 +f 2781 2779 2827 +f 2781 2733 2779 +f 2828 2781 2829 +f 2828 2780 2781 +f 2830 2780 2828 +f 2830 2782 2780 +f 2831 2782 2830 +f 2831 2783 2782 +f 2832 2783 2831 +f 2832 2784 2783 +f 2833 2784 2832 +f 2833 2785 2784 +f 2834 2785 2833 +f 2834 2786 2785 +f 2835 2786 2834 +f 2835 2787 2786 +f 2836 2787 2835 +f 2836 2788 2787 +f 2837 2788 2836 +f 2837 2789 2788 +f 2838 2789 2837 +f 2838 2790 2789 +f 2839 2790 2838 +f 2839 2791 2790 +f 2840 2791 2839 +f 2840 2792 2791 +f 2841 2792 2840 +f 2841 2793 2792 +f 2842 2793 2841 +f 2842 2794 2793 +f 2843 2794 2842 +f 2843 2795 2794 +f 2844 2795 2843 +f 2844 2796 2795 +f 2845 2796 2844 +f 2845 2797 2796 +f 2846 2797 2845 +f 2846 2798 2797 +f 2847 2798 2846 +f 2847 2799 2798 +f 2848 2799 2847 +f 2848 2800 2799 +f 2849 2800 2848 +f 2849 2801 2800 +f 2850 2801 2849 +f 2850 2802 2801 +f 2851 2802 2850 +f 2851 2803 2802 +f 2852 2803 2851 +f 2852 2804 2803 +f 2853 2804 2852 +f 2853 2805 2804 +f 2854 2805 2853 +f 2854 2806 2805 +f 2855 2806 2854 +f 2855 2807 2806 +f 2856 2807 2855 +f 2856 2808 2807 +f 2857 2808 2856 +f 2857 2809 2808 +f 2858 2809 2857 +f 2858 2810 2809 +f 2859 2810 2858 +f 2859 2811 2810 +f 2860 2811 2859 +f 2860 2812 2811 +f 2861 2812 2860 +f 2861 2813 2812 +f 2861 2814 2813 +f 2862 2814 2861 +f 2863 2814 2862 +f 2863 2815 2814 +f 2864 2815 2863 +f 2864 2816 2815 +f 2865 2816 2864 +f 2865 2817 2816 +f 2866 2817 2865 +f 2866 2818 2817 +f 2867 2818 2866 +f 2867 2819 2818 +f 2868 2819 2867 +f 2868 2820 2819 +f 2869 2820 2868 +f 2869 2821 2820 +f 2870 2821 2869 +f 2870 2822 2821 +f 2871 2822 2870 +f 2871 2823 2822 +f 2872 2823 2871 +f 2872 2824 2823 +f 2873 2824 2872 +f 2873 2825 2824 +f 2874 2825 2873 +f 2874 2826 2825 +f 2875 2826 2874 +f 2875 2827 2826 +f 2829 2827 2875 +f 2829 2781 2827 +f 2876 597 2877 +f 2876 2878 597 +f 2879 2878 2876 +f 2879 2880 2878 +f 2881 2880 2879 +f 2881 2882 2880 +f 2883 2882 2881 +f 2883 2884 2882 +f 2885 2884 2883 +f 2885 2886 2884 +f 2887 2886 2885 +f 2887 2888 2886 +f 2889 2888 2887 +f 2889 2890 2888 +f 2891 2890 2889 +f 2891 2892 2890 +f 2893 2892 2891 +f 2893 2894 2892 +f 2895 2894 2893 +f 2895 2896 2894 +f 2895 2897 2896 +f 2898 2897 2895 +f 2899 2897 2898 +f 2899 2900 2897 +f 2901 2900 2899 +f 2901 2902 2900 +f 2903 2902 2901 +f 2903 2904 2902 +f 2905 2904 2903 +f 2905 2906 2904 +f 2907 2906 2905 +f 2907 2908 2906 +f 2909 2908 2907 +f 2909 2910 2908 +f 2911 2910 2909 +f 2911 2912 2910 +f 2913 2912 2911 +f 2913 2914 2912 +f 2915 2914 2913 +f 2915 2916 2914 +f 2917 2916 2915 +f 2917 2918 2916 +f 2919 2918 2917 +f 2919 2920 2918 +f 2921 2920 2919 +f 2921 2922 2920 +f 2923 2922 2921 +f 2923 2924 2922 +f 2925 2924 2923 +f 2925 2926 2924 +f 2927 2926 2925 +f 2927 2928 2926 +f 2929 2928 2927 +f 2929 2930 2928 +f 2931 2930 2929 +f 2931 2932 2930 +f 2933 2932 2931 +f 2933 2934 2932 +f 2935 2934 2933 +f 2935 2936 2934 +f 2937 2936 2935 +f 2937 2938 2936 +f 2939 2938 2937 +f 2939 2940 2938 +f 2941 2940 2939 +f 2941 2942 2940 +f 2943 2942 2941 +f 2943 2944 2942 +f 2945 2944 2943 +f 2945 2946 2944 +f 2947 2946 2945 +f 2947 2948 2946 +f 2949 2948 2947 +f 2949 2950 2948 +f 2951 2950 2949 +f 2951 2952 2950 +f 2953 2952 2951 +f 2953 2954 2952 +f 2955 2954 2953 +f 2955 2956 2954 +f 2957 2956 2955 +f 2957 2958 2956 +f 2959 2958 2957 +f 2959 2960 2958 +f 2961 2960 2959 +f 2961 2962 2960 +f 2963 2962 2961 +f 2963 2964 2962 +f 2965 2964 2963 +f 2965 2966 2964 +f 2967 2966 2965 +f 2967 2968 2966 +f 2969 2968 2967 +f 2969 2970 2968 +f 2969 597 2970 +f 2877 597 2969 +f 2971 2877 2972 +f 2971 2876 2877 +f 2973 2876 2971 +f 2973 2879 2876 +f 2974 2879 2973 +f 2974 2881 2879 +f 2975 2881 2974 +f 2975 2883 2881 +f 2976 2883 2975 +f 2976 2885 2883 +f 2977 2885 2976 +f 2977 2887 2885 +f 2978 2887 2977 +f 2978 2889 2887 +f 2979 2889 2978 +f 2979 2891 2889 +f 2980 2891 2979 +f 2980 2893 2891 +f 2981 2893 2980 +f 2981 2895 2893 +f 2982 2895 2981 +f 2982 2898 2895 +f 2983 2898 2982 +f 2983 2899 2898 +f 2984 2899 2983 +f 2984 2901 2899 +f 2985 2901 2984 +f 2985 2903 2901 +f 2986 2903 2985 +f 2986 2905 2903 +f 2987 2905 2986 +f 2987 2907 2905 +f 2988 2907 2987 +f 2988 2909 2907 +f 2989 2909 2988 +f 2989 2911 2909 +f 2990 2911 2989 +f 2990 2913 2911 +f 2991 2913 2990 +f 2991 2915 2913 +f 2992 2915 2991 +f 2992 2917 2915 +f 2993 2917 2992 +f 2993 2919 2917 +f 2994 2919 2993 +f 2994 2921 2919 +f 2995 2921 2994 +f 2995 2923 2921 +f 2996 2923 2995 +f 2996 2925 2923 +f 2997 2925 2996 +f 2997 2927 2925 +f 2998 2927 2997 +f 2998 2929 2927 +f 2999 2929 2998 +f 2999 2931 2929 +f 3000 2931 2999 +f 3000 2933 2931 +f 3001 2933 3000 +f 3001 2935 2933 +f 3002 2935 3001 +f 3002 2937 2935 +f 3003 2937 3002 +f 3003 2939 2937 +f 3004 2939 3003 +f 3004 2941 2939 +f 3005 2941 3004 +f 3005 2943 2941 +f 3006 2943 3005 +f 3006 2945 2943 +f 3007 2945 3006 +f 3007 2947 2945 +f 3008 2947 3007 +f 3008 2949 2947 +f 3009 2949 3008 +f 3009 2951 2949 +f 3010 2951 3009 +f 3010 2953 2951 +f 3011 2953 3010 +f 3011 2955 2953 +f 3012 2955 3011 +f 3012 2957 2955 +f 3013 2957 3012 +f 3013 2959 2957 +f 3014 2959 3013 +f 3014 2961 2959 +f 3015 2961 3014 +f 3015 2963 2961 +f 3016 2963 3015 +f 3016 2965 2963 +f 3017 2965 3016 +f 3017 2967 2965 +f 3018 2967 3017 +f 3018 2969 2967 +f 2972 2969 3018 +f 2972 2877 2969 +f 3019 2972 3020 +f 3019 2971 2972 +f 3021 2971 3019 +f 3021 2973 2971 +f 3022 2973 3021 +f 3022 2974 2973 +f 3023 2974 3022 +f 3023 2975 2974 +f 3024 2975 3023 +f 3024 2976 2975 +f 3025 2976 3024 +f 3025 2977 2976 +f 3026 2977 3025 +f 3026 2978 2977 +f 3027 2978 3026 +f 3027 2979 2978 +f 3028 2979 3027 +f 3028 2980 2979 +f 3029 2980 3028 +f 3029 2981 2980 +f 3030 2981 3029 +f 3030 2982 2981 +f 3031 2982 3030 +f 3031 2983 2982 +f 3032 2983 3031 +f 3032 2984 2983 +f 3033 2984 3032 +f 3033 2985 2984 +f 3034 2985 3033 +f 3034 2986 2985 +f 3035 2986 3034 +f 3035 2987 2986 +f 3036 2987 3035 +f 3036 2988 2987 +f 3037 2988 3036 +f 3037 2989 2988 +f 3038 2989 3037 +f 3038 2990 2989 +f 3039 2990 3038 +f 3039 2991 2990 +f 3040 2991 3039 +f 3040 2992 2991 +f 3041 2992 3040 +f 3041 2993 2992 +f 3042 2993 3041 +f 3042 2994 2993 +f 3043 2994 3042 +f 3043 2995 2994 +f 3044 2995 3043 +f 3044 2996 2995 +f 3045 2996 3044 +f 3045 2997 2996 +f 3046 2997 3045 +f 3046 2998 2997 +f 3047 2998 3046 +f 3047 2999 2998 +f 3048 2999 3047 +f 3048 3000 2999 +f 3049 3000 3048 +f 3049 3001 3000 +f 3050 3001 3049 +f 3050 3002 3001 +f 3051 3002 3050 +f 3051 3003 3002 +f 3052 3003 3051 +f 3052 3004 3003 +f 3053 3004 3052 +f 3053 3005 3004 +f 3054 3005 3053 +f 3054 3006 3005 +f 3055 3006 3054 +f 3055 3007 3006 +f 3056 3007 3055 +f 3056 3008 3007 +f 3057 3008 3056 +f 3057 3009 3008 +f 3058 3009 3057 +f 3058 3010 3009 +f 3059 3010 3058 +f 3059 3011 3010 +f 3060 3011 3059 +f 3060 3012 3011 +f 3061 3012 3060 +f 3061 3013 3012 +f 3062 3013 3061 +f 3062 3014 3013 +f 3063 3014 3062 +f 3063 3015 3014 +f 3064 3015 3063 +f 3064 3016 3015 +f 3065 3016 3064 +f 3065 3017 3016 +f 3066 3017 3065 +f 3066 3018 3017 +f 3020 3018 3066 +f 3020 2972 3018 +f 3067 3020 3068 +f 3067 3019 3020 +f 3069 3019 3067 +f 3069 3021 3019 +f 3070 3021 3069 +f 3070 3022 3021 +f 3071 3022 3070 +f 3071 3023 3022 +f 3072 3023 3071 +f 3072 3024 3023 +f 3073 3024 3072 +f 3073 3025 3024 +f 3074 3025 3073 +f 3074 3026 3025 +f 3075 3026 3074 +f 3075 3027 3026 +f 3076 3027 3075 +f 3076 3028 3027 +f 3077 3028 3076 +f 3077 3029 3028 +f 3078 3029 3077 +f 3078 3030 3029 +f 3079 3030 3078 +f 3079 3031 3030 +f 3080 3031 3079 +f 3080 3032 3031 +f 3081 3032 3080 +f 3081 3033 3032 +f 3082 3033 3081 +f 3082 3034 3033 +f 3083 3034 3082 +f 3083 3035 3034 +f 3084 3035 3083 +f 3084 3036 3035 +f 3085 3036 3084 +f 3085 3037 3036 +f 3086 3037 3085 +f 3086 3038 3037 +f 3087 3038 3086 +f 3087 3039 3038 +f 3088 3039 3087 +f 3088 3040 3039 +f 3089 3040 3088 +f 3089 3041 3040 +f 3090 3041 3089 +f 3090 3042 3041 +f 3091 3042 3090 +f 3091 3043 3042 +f 3092 3043 3091 +f 3092 3044 3043 +f 3093 3044 3092 +f 3093 3045 3044 +f 3094 3045 3093 +f 3094 3046 3045 +f 3095 3046 3094 +f 3095 3047 3046 +f 3096 3047 3095 +f 3096 3048 3047 +f 3097 3048 3096 +f 3097 3049 3048 +f 3098 3049 3097 +f 3098 3050 3049 +f 3099 3050 3098 +f 3099 3051 3050 +f 3100 3051 3099 +f 3100 3052 3051 +f 3101 3052 3100 +f 3101 3053 3052 +f 3102 3053 3101 +f 3102 3054 3053 +f 3103 3054 3102 +f 3103 3055 3054 +f 3104 3055 3103 +f 3104 3056 3055 +f 3105 3056 3104 +f 3105 3057 3056 +f 3106 3057 3105 +f 3106 3058 3057 +f 3107 3058 3106 +f 3107 3059 3058 +f 3108 3059 3107 +f 3108 3060 3059 +f 3109 3060 3108 +f 3109 3061 3060 +f 3110 3061 3109 +f 3110 3062 3061 +f 3111 3062 3110 +f 3111 3063 3062 +f 3112 3063 3111 +f 3112 3064 3063 +f 3113 3064 3112 +f 3113 3065 3064 +f 3114 3065 3113 +f 3114 3066 3065 +f 3068 3066 3114 +f 3068 3020 3066 +f 3115 3068 3116 +f 3115 3067 3068 +f 3117 3067 3115 +f 3117 3069 3067 +f 3118 3069 3117 +f 3118 3070 3069 +f 3119 3070 3118 +f 3119 3071 3070 +f 3120 3071 3119 +f 3120 3072 3071 +f 3121 3072 3120 +f 3121 3073 3072 +f 3122 3073 3121 +f 3122 3074 3073 +f 3123 3074 3122 +f 3123 3075 3074 +f 3124 3075 3123 +f 3124 3076 3075 +f 3125 3076 3124 +f 3125 3077 3076 +f 3126 3077 3125 +f 3126 3078 3077 +f 3127 3078 3126 +f 3127 3079 3078 +f 3128 3079 3127 +f 3128 3080 3079 +f 3129 3080 3128 +f 3129 3081 3080 +f 3130 3081 3129 +f 3130 3082 3081 +f 3131 3082 3130 +f 3131 3083 3082 +f 3132 3083 3131 +f 3132 3084 3083 +f 3133 3084 3132 +f 3133 3085 3084 +f 3134 3085 3133 +f 3134 3086 3085 +f 3135 3086 3134 +f 3135 3087 3086 +f 3136 3087 3135 +f 3136 3088 3087 +f 3137 3088 3136 +f 3137 3089 3088 +f 3138 3089 3137 +f 3138 3090 3089 +f 3139 3090 3138 +f 3139 3091 3090 +f 3140 3091 3139 +f 3140 3092 3091 +f 3141 3092 3140 +f 3141 3093 3092 +f 3142 3093 3141 +f 3142 3094 3093 +f 3143 3094 3142 +f 3143 3095 3094 +f 3144 3095 3143 +f 3144 3096 3095 +f 3145 3096 3144 +f 3145 3097 3096 +f 3146 3097 3145 +f 3146 3098 3097 +f 3147 3098 3146 +f 3147 3099 3098 +f 3148 3099 3147 +f 3148 3100 3099 +f 3149 3100 3148 +f 3149 3101 3100 +f 3150 3101 3149 +f 3150 3102 3101 +f 3151 3102 3150 +f 3151 3103 3102 +f 3152 3103 3151 +f 3152 3104 3103 +f 3153 3104 3152 +f 3153 3105 3104 +f 3154 3105 3153 +f 3154 3106 3105 +f 3155 3106 3154 +f 3155 3107 3106 +f 3156 3107 3155 +f 3156 3108 3107 +f 3157 3108 3156 +f 3157 3109 3108 +f 3158 3109 3157 +f 3158 3110 3109 +f 3159 3110 3158 +f 3159 3111 3110 +f 3160 3111 3159 +f 3160 3112 3111 +f 3161 3112 3160 +f 3161 3113 3112 +f 3162 3113 3161 +f 3162 3114 3113 +f 3116 3114 3162 +f 3116 3068 3114 +f 3163 3116 3164 +f 3163 3115 3116 +f 3165 3115 3163 +f 3165 3117 3115 +f 3166 3117 3165 +f 3166 3118 3117 +f 3167 3118 3166 +f 3167 3119 3118 +f 3168 3119 3167 +f 3168 3120 3119 +f 3169 3120 3168 +f 3169 3121 3120 +f 3170 3121 3169 +f 3170 3122 3121 +f 3171 3122 3170 +f 3171 3123 3122 +f 3172 3123 3171 +f 3172 3124 3123 +f 3173 3124 3172 +f 3173 3125 3124 +f 3174 3125 3173 +f 3174 3126 3125 +f 3175 3126 3174 +f 3175 3127 3126 +f 3176 3127 3175 +f 3176 3128 3127 +f 3177 3128 3176 +f 3177 3129 3128 +f 3178 3129 3177 +f 3178 3130 3129 +f 3179 3130 3178 +f 3179 3131 3130 +f 3180 3131 3179 +f 3180 3132 3131 +f 3181 3132 3180 +f 3181 3133 3132 +f 3182 3133 3181 +f 3182 3134 3133 +f 3183 3134 3182 +f 3183 3135 3134 +f 3184 3135 3183 +f 3184 3136 3135 +f 3185 3136 3184 +f 3185 3137 3136 +f 3186 3137 3185 +f 3186 3138 3137 +f 3187 3138 3186 +f 3187 3139 3138 +f 3188 3139 3187 +f 3188 3140 3139 +f 3189 3140 3188 +f 3189 3141 3140 +f 3190 3141 3189 +f 3190 3142 3141 +f 3191 3142 3190 +f 3191 3143 3142 +f 3192 3143 3191 +f 3192 3144 3143 +f 3193 3144 3192 +f 3193 3145 3144 +f 3194 3145 3193 +f 3194 3146 3145 +f 3195 3146 3194 +f 3195 3147 3146 +f 3196 3147 3195 +f 3196 3148 3147 +f 3197 3148 3196 +f 3197 3149 3148 +f 3198 3149 3197 +f 3198 3150 3149 +f 3199 3150 3198 +f 3199 3151 3150 +f 3200 3151 3199 +f 3200 3152 3151 +f 3201 3152 3200 +f 3201 3153 3152 +f 3202 3153 3201 +f 3202 3154 3153 +f 3203 3154 3202 +f 3203 3155 3154 +f 3204 3155 3203 +f 3204 3156 3155 +f 3205 3156 3204 +f 3205 3157 3156 +f 3206 3157 3205 +f 3206 3158 3157 +f 3207 3158 3206 +f 3207 3159 3158 +f 3208 3159 3207 +f 3208 3160 3159 +f 3209 3160 3208 +f 3209 3161 3160 +f 3210 3161 3209 +f 3210 3162 3161 +f 3164 3162 3210 +f 3164 3116 3162 +f 3211 3164 3212 +f 3211 3163 3164 +f 3213 3163 3211 +f 3213 3165 3163 +f 3214 3165 3213 +f 3214 3166 3165 +f 3215 3166 3214 +f 3215 3167 3166 +f 3216 3167 3215 +f 3216 3168 3167 +f 3217 3168 3216 +f 3217 3169 3168 +f 3218 3169 3217 +f 3218 3170 3169 +f 3219 3170 3218 +f 3219 3171 3170 +f 3220 3171 3219 +f 3220 3172 3171 +f 3221 3172 3220 +f 3221 3173 3172 +f 3222 3173 3221 +f 3222 3174 3173 +f 3223 3174 3222 +f 3223 3175 3174 +f 3224 3175 3223 +f 3224 3176 3175 +f 3225 3176 3224 +f 3225 3177 3176 +f 3226 3177 3225 +f 3226 3178 3177 +f 3227 3178 3226 +f 3227 3179 3178 +f 3228 3179 3227 +f 3228 3180 3179 +f 3229 3180 3228 +f 3229 3181 3180 +f 3230 3181 3229 +f 3230 3182 3181 +f 3231 3182 3230 +f 3231 3183 3182 +f 3232 3183 3231 +f 3232 3184 3183 +f 3233 3184 3232 +f 3233 3185 3184 +f 3234 3185 3233 +f 3234 3186 3185 +f 3235 3186 3234 +f 3235 3187 3186 +f 3236 3187 3235 +f 3236 3188 3187 +f 3237 3188 3236 +f 3237 3189 3188 +f 3238 3189 3237 +f 3238 3190 3189 +f 3239 3190 3238 +f 3239 3191 3190 +f 3240 3191 3239 +f 3240 3192 3191 +f 3241 3192 3240 +f 3241 3193 3192 +f 3242 3193 3241 +f 3242 3194 3193 +f 3243 3194 3242 +f 3243 3195 3194 +f 3244 3195 3243 +f 3244 3196 3195 +f 3245 3196 3244 +f 3245 3197 3196 +f 3246 3197 3245 +f 3246 3198 3197 +f 3247 3198 3246 +f 3247 3199 3198 +f 3248 3199 3247 +f 3248 3200 3199 +f 3248 3201 3200 +f 3249 3201 3248 +f 3250 3201 3249 +f 3250 3202 3201 +f 3251 3202 3250 +f 3251 3203 3202 +f 3252 3203 3251 +f 3252 3204 3203 +f 3253 3204 3252 +f 3253 3205 3204 +f 3254 3205 3253 +f 3254 3206 3205 +f 3255 3206 3254 +f 3255 3207 3206 +f 3256 3207 3255 +f 3256 3208 3207 +f 3257 3208 3256 +f 3257 3209 3208 +f 3258 3209 3257 +f 3258 3210 3209 +f 3212 3210 3258 +f 3212 3164 3210 +f 3259 741 3260 +f 3259 3261 741 +f 3262 3261 3259 +f 3262 3263 3261 +f 3264 3263 3262 +f 3264 3265 3263 +f 3266 3265 3264 +f 3266 3267 3265 +f 3268 3267 3266 +f 3268 3269 3267 +f 3270 3269 3268 +f 3270 3271 3269 +f 3272 3271 3270 +f 3272 3273 3271 +f 3274 3273 3272 +f 3274 3275 3273 +f 3276 3275 3274 +f 3276 3277 3275 +f 3278 3277 3276 +f 3278 3279 3277 +f 3278 3280 3279 +f 3281 3280 3278 +f 3282 3280 3281 +f 3282 3283 3280 +f 3284 3283 3282 +f 3284 3285 3283 +f 3286 3285 3284 +f 3286 3287 3285 +f 3288 3287 3286 +f 3288 3289 3287 +f 3290 3289 3288 +f 3290 3291 3289 +f 3292 3291 3290 +f 3292 3293 3291 +f 3294 3293 3292 +f 3294 3295 3293 +f 3296 3295 3294 +f 3296 3297 3295 +f 3298 3297 3296 +f 3298 3299 3297 +f 3300 3299 3298 +f 3300 3301 3299 +f 3302 3301 3300 +f 3302 3303 3301 +f 3304 3303 3302 +f 3304 3305 3303 +f 3306 3305 3304 +f 3306 3307 3305 +f 3308 3307 3306 +f 3308 3309 3307 +f 3310 3309 3308 +f 3310 3311 3309 +f 3312 3311 3310 +f 3312 3313 3311 +f 3314 3313 3312 +f 3314 3315 3313 +f 3316 3315 3314 +f 3316 3317 3315 +f 3318 3317 3316 +f 3318 3319 3317 +f 3320 3319 3318 +f 3320 3321 3319 +f 3322 3321 3320 +f 3322 3323 3321 +f 3324 3323 3322 +f 3324 3325 3323 +f 3326 3325 3324 +f 3326 3327 3325 +f 3328 3327 3326 +f 3328 3329 3327 +f 3330 3329 3328 +f 3330 3331 3329 +f 3332 3331 3330 +f 3332 3333 3331 +f 3334 3333 3332 +f 3334 3335 3333 +f 3336 3335 3334 +f 3336 3337 3335 +f 3338 3337 3336 +f 3338 3339 3337 +f 3340 3339 3338 +f 3340 3341 3339 +f 3342 3341 3340 +f 3342 3343 3341 +f 3344 3343 3342 +f 3344 3345 3343 +f 3346 3345 3344 +f 3346 3347 3345 +f 3348 3347 3346 +f 3348 3349 3347 +f 3350 3349 3348 +f 3350 3351 3349 +f 3352 3351 3350 +f 3352 3353 3351 +f 3260 3353 3352 +f 3260 741 3353 +f 3354 3260 3355 +f 3354 3259 3260 +f 3356 3259 3354 +f 3356 3262 3259 +f 3357 3262 3356 +f 3357 3264 3262 +f 3358 3264 3357 +f 3358 3266 3264 +f 3359 3266 3358 +f 3359 3268 3266 +f 3360 3268 3359 +f 3360 3270 3268 +f 3361 3270 3360 +f 3361 3272 3270 +f 3362 3272 3361 +f 3362 3274 3272 +f 3363 3274 3362 +f 3363 3276 3274 +f 3364 3276 3363 +f 3364 3278 3276 +f 3365 3278 3364 +f 3365 3281 3278 +f 3366 3281 3365 +f 3366 3282 3281 +f 3367 3282 3366 +f 3367 3284 3282 +f 3368 3284 3367 +f 3368 3286 3284 +f 3369 3286 3368 +f 3369 3288 3286 +f 3370 3288 3369 +f 3370 3290 3288 +f 3371 3290 3370 +f 3371 3292 3290 +f 3372 3292 3371 +f 3372 3294 3292 +f 3373 3294 3372 +f 3373 3296 3294 +f 3374 3296 3373 +f 3374 3298 3296 +f 3375 3298 3374 +f 3375 3300 3298 +f 3376 3300 3375 +f 3376 3302 3300 +f 3377 3302 3376 +f 3377 3304 3302 +f 3378 3304 3377 +f 3378 3306 3304 +f 3379 3306 3378 +f 3379 3308 3306 +f 3380 3308 3379 +f 3380 3310 3308 +f 3381 3310 3380 +f 3381 3312 3310 +f 3382 3312 3381 +f 3382 3314 3312 +f 3383 3314 3382 +f 3383 3316 3314 +f 3384 3316 3383 +f 3384 3318 3316 +f 3385 3318 3384 +f 3385 3320 3318 +f 3386 3320 3385 +f 3386 3322 3320 +f 3387 3322 3386 +f 3387 3324 3322 +f 3388 3324 3387 +f 3388 3326 3324 +f 3389 3326 3388 +f 3389 3328 3326 +f 3390 3328 3389 +f 3390 3330 3328 +f 3391 3330 3390 +f 3391 3332 3330 +f 3392 3332 3391 +f 3392 3334 3332 +f 3393 3334 3392 +f 3393 3336 3334 +f 3394 3336 3393 +f 3394 3338 3336 +f 3395 3338 3394 +f 3395 3340 3338 +f 3396 3340 3395 +f 3396 3342 3340 +f 3397 3342 3396 +f 3397 3344 3342 +f 3398 3344 3397 +f 3398 3346 3344 +f 3399 3346 3398 +f 3399 3348 3346 +f 3400 3348 3399 +f 3400 3350 3348 +f 3401 3350 3400 +f 3401 3352 3350 +f 3355 3352 3401 +f 3355 3260 3352 +f 3402 3355 3403 +f 3402 3354 3355 +f 3404 3354 3402 +f 3404 3356 3354 +f 3405 3356 3404 +f 3405 3357 3356 +f 3406 3357 3405 +f 3406 3358 3357 +f 3407 3358 3406 +f 3407 3359 3358 +f 3408 3359 3407 +f 3408 3360 3359 +f 3409 3360 3408 +f 3409 3361 3360 +f 3410 3361 3409 +f 3410 3362 3361 +f 3411 3362 3410 +f 3411 3363 3362 +f 3412 3363 3411 +f 3412 3364 3363 +f 3413 3364 3412 +f 3413 3365 3364 +f 3414 3365 3413 +f 3414 3366 3365 +f 3415 3366 3414 +f 3415 3367 3366 +f 3416 3367 3415 +f 3416 3368 3367 +f 3417 3368 3416 +f 3417 3369 3368 +f 3418 3369 3417 +f 3418 3370 3369 +f 3419 3370 3418 +f 3419 3371 3370 +f 3420 3371 3419 +f 3420 3372 3371 +f 3421 3372 3420 +f 3421 3373 3372 +f 3422 3373 3421 +f 3422 3374 3373 +f 3423 3374 3422 +f 3423 3375 3374 +f 3424 3375 3423 +f 3424 3376 3375 +f 3425 3376 3424 +f 3425 3377 3376 +f 3426 3377 3425 +f 3426 3378 3377 +f 3427 3378 3426 +f 3427 3379 3378 +f 3428 3379 3427 +f 3428 3380 3379 +f 3429 3380 3428 +f 3429 3381 3380 +f 3430 3381 3429 +f 3430 3382 3381 +f 3431 3382 3430 +f 3431 3383 3382 +f 3432 3383 3431 +f 3432 3384 3383 +f 3433 3384 3432 +f 3433 3385 3384 +f 3434 3385 3433 +f 3434 3386 3385 +f 3435 3386 3434 +f 3435 3387 3386 +f 3436 3387 3435 +f 3436 3388 3387 +f 3437 3388 3436 +f 3437 3389 3388 +f 3438 3389 3437 +f 3438 3390 3389 +f 3439 3390 3438 +f 3439 3391 3390 +f 3440 3391 3439 +f 3440 3392 3391 +f 3441 3392 3440 +f 3441 3393 3392 +f 3442 3393 3441 +f 3442 3394 3393 +f 3443 3394 3442 +f 3443 3395 3394 +f 3444 3395 3443 +f 3444 3396 3395 +f 3445 3396 3444 +f 3445 3397 3396 +f 3446 3397 3445 +f 3446 3398 3397 +f 3447 3398 3446 +f 3447 3399 3398 +f 3448 3399 3447 +f 3448 3400 3399 +f 3449 3400 3448 +f 3449 3401 3400 +f 3403 3401 3449 +f 3403 3355 3401 +f 3450 3403 3451 +f 3450 3402 3403 +f 3452 3402 3450 +f 3452 3404 3402 +f 3453 3404 3452 +f 3453 3405 3404 +f 3454 3405 3453 +f 3454 3406 3405 +f 3455 3406 3454 +f 3455 3407 3406 +f 3456 3407 3455 +f 3456 3408 3407 +f 3457 3408 3456 +f 3457 3409 3408 +f 3458 3409 3457 +f 3458 3410 3409 +f 3459 3410 3458 +f 3459 3411 3410 +f 3460 3411 3459 +f 3460 3412 3411 +f 3461 3412 3460 +f 3461 3413 3412 +f 3462 3413 3461 +f 3462 3414 3413 +f 3463 3414 3462 +f 3463 3415 3414 +f 3464 3415 3463 +f 3464 3416 3415 +f 3465 3416 3464 +f 3465 3417 3416 +f 3466 3417 3465 +f 3466 3418 3417 +f 3467 3418 3466 +f 3467 3419 3418 +f 3468 3419 3467 +f 3468 3420 3419 +f 3469 3420 3468 +f 3469 3421 3420 +f 3470 3421 3469 +f 3470 3422 3421 +f 3471 3422 3470 +f 3471 3423 3422 +f 3472 3423 3471 +f 3472 3424 3423 +f 3473 3424 3472 +f 3473 3425 3424 +f 3474 3425 3473 +f 3474 3426 3425 +f 3475 3426 3474 +f 3475 3427 3426 +f 3476 3427 3475 +f 3476 3428 3427 +f 3477 3428 3476 +f 3477 3429 3428 +f 3478 3429 3477 +f 3478 3430 3429 +f 3479 3430 3478 +f 3479 3431 3430 +f 3480 3431 3479 +f 3480 3432 3431 +f 3481 3432 3480 +f 3481 3433 3432 +f 3482 3433 3481 +f 3482 3434 3433 +f 3483 3434 3482 +f 3483 3435 3434 +f 3484 3435 3483 +f 3484 3436 3435 +f 3485 3436 3484 +f 3485 3437 3436 +f 3486 3437 3485 +f 3486 3438 3437 +f 3487 3438 3486 +f 3487 3439 3438 +f 3488 3439 3487 +f 3488 3440 3439 +f 3489 3440 3488 +f 3489 3441 3440 +f 3490 3441 3489 +f 3490 3442 3441 +f 3491 3442 3490 +f 3491 3443 3442 +f 3492 3443 3491 +f 3492 3444 3443 +f 3493 3444 3492 +f 3493 3445 3444 +f 3494 3445 3493 +f 3494 3446 3445 +f 3495 3446 3494 +f 3495 3447 3446 +f 3496 3447 3495 +f 3496 3448 3447 +f 3497 3448 3496 +f 3497 3449 3448 +f 3451 3449 3497 +f 3451 3403 3449 +f 3498 3451 3499 +f 3498 3450 3451 +f 3500 3450 3498 +f 3500 3452 3450 +f 3501 3452 3500 +f 3501 3453 3452 +f 3502 3453 3501 +f 3502 3454 3453 +f 3503 3454 3502 +f 3503 3455 3454 +f 3504 3455 3503 +f 3504 3456 3455 +f 3505 3456 3504 +f 3505 3457 3456 +f 3506 3457 3505 +f 3506 3458 3457 +f 3507 3458 3506 +f 3507 3459 3458 +f 3508 3459 3507 +f 3508 3460 3459 +f 3509 3460 3508 +f 3509 3461 3460 +f 3510 3461 3509 +f 3510 3462 3461 +f 3511 3462 3510 +f 3511 3463 3462 +f 3512 3463 3511 +f 3512 3464 3463 +f 3513 3464 3512 +f 3513 3465 3464 +f 3514 3465 3513 +f 3514 3466 3465 +f 3515 3466 3514 +f 3515 3467 3466 +f 3516 3467 3515 +f 3516 3468 3467 +f 3517 3468 3516 +f 3517 3469 3468 +f 3518 3469 3517 +f 3518 3470 3469 +f 3519 3470 3518 +f 3519 3471 3470 +f 3520 3471 3519 +f 3520 3472 3471 +f 3521 3472 3520 +f 3521 3473 3472 +f 3522 3473 3521 +f 3522 3474 3473 +f 3523 3474 3522 +f 3523 3475 3474 +f 3524 3475 3523 +f 3524 3476 3475 +f 3525 3476 3524 +f 3525 3477 3476 +f 3526 3477 3525 +f 3526 3478 3477 +f 3527 3478 3526 +f 3527 3479 3478 +f 3528 3479 3527 +f 3528 3480 3479 +f 3529 3480 3528 +f 3529 3481 3480 +f 3530 3481 3529 +f 3530 3482 3481 +f 3531 3482 3530 +f 3531 3483 3482 +f 3532 3483 3531 +f 3532 3484 3483 +f 3533 3484 3532 +f 3533 3485 3484 +f 3534 3485 3533 +f 3534 3486 3485 +f 3535 3486 3534 +f 3535 3487 3486 +f 3536 3487 3535 +f 3536 3488 3487 +f 3537 3488 3536 +f 3537 3489 3488 +f 3538 3489 3537 +f 3538 3490 3489 +f 3539 3490 3538 +f 3539 3491 3490 +f 3540 3491 3539 +f 3540 3492 3491 +f 3541 3492 3540 +f 3541 3493 3492 +f 3542 3493 3541 +f 3542 3494 3493 +f 3543 3494 3542 +f 3543 3495 3494 +f 3544 3495 3543 +f 3544 3496 3495 +f 3545 3496 3544 +f 3545 3497 3496 +f 3499 3497 3545 +f 3499 3451 3497 +f 3546 3499 3547 +f 3546 3498 3499 +f 3548 3498 3546 +f 3548 3500 3498 +f 3549 3500 3548 +f 3549 3501 3500 +f 3550 3501 3549 +f 3550 3502 3501 +f 3551 3502 3550 +f 3551 3503 3502 +f 3552 3503 3551 +f 3552 3504 3503 +f 3553 3504 3552 +f 3553 3505 3504 +f 3554 3505 3553 +f 3554 3506 3505 +f 3555 3506 3554 +f 3555 3507 3506 +f 3556 3507 3555 +f 3556 3508 3507 +f 3557 3508 3556 +f 3557 3509 3508 +f 3558 3509 3557 +f 3558 3510 3509 +f 3559 3510 3558 +f 3559 3511 3510 +f 3560 3511 3559 +f 3560 3512 3511 +f 3561 3512 3560 +f 3561 3513 3512 +f 3562 3513 3561 +f 3562 3514 3513 +f 3563 3514 3562 +f 3563 3515 3514 +f 3564 3515 3563 +f 3564 3516 3515 +f 3565 3516 3564 +f 3565 3517 3516 +f 3566 3517 3565 +f 3566 3518 3517 +f 3567 3518 3566 +f 3567 3519 3518 +f 3568 3519 3567 +f 3568 3520 3519 +f 3569 3520 3568 +f 3569 3521 3520 +f 3570 3521 3569 +f 3570 3522 3521 +f 3571 3522 3570 +f 3571 3523 3522 +f 3572 3523 3571 +f 3572 3524 3523 +f 3573 3524 3572 +f 3573 3525 3524 +f 3574 3525 3573 +f 3574 3526 3525 +f 3575 3526 3574 +f 3575 3527 3526 +f 3576 3527 3575 +f 3576 3528 3527 +f 3577 3528 3576 +f 3577 3529 3528 +f 3578 3529 3577 +f 3578 3530 3529 +f 3579 3530 3578 +f 3579 3531 3530 +f 3580 3531 3579 +f 3580 3532 3531 +f 3581 3532 3580 +f 3581 3533 3532 +f 3582 3533 3581 +f 3582 3534 3533 +f 3583 3534 3582 +f 3583 3535 3534 +f 3584 3535 3583 +f 3584 3536 3535 +f 3585 3536 3584 +f 3585 3537 3536 +f 3586 3537 3585 +f 3586 3538 3537 +f 3587 3538 3586 +f 3587 3539 3538 +f 3588 3539 3587 +f 3588 3540 3539 +f 3589 3540 3588 +f 3589 3541 3540 +f 3590 3541 3589 +f 3590 3542 3541 +f 3591 3542 3590 +f 3591 3543 3542 +f 3592 3543 3591 +f 3592 3544 3543 +f 3593 3544 3592 +f 3593 3545 3544 +f 3547 3545 3593 +f 3547 3499 3545 +f 3594 3547 3595 +f 3594 3546 3547 +f 3596 3546 3594 +f 3596 3548 3546 +f 3597 3548 3596 +f 3597 3549 3548 +f 3598 3549 3597 +f 3598 3550 3549 +f 3599 3550 3598 +f 3599 3551 3550 +f 3600 3551 3599 +f 3600 3552 3551 +f 3601 3552 3600 +f 3601 3553 3552 +f 3602 3553 3601 +f 3602 3554 3553 +f 3603 3554 3602 +f 3603 3555 3554 +f 3604 3555 3603 +f 3604 3556 3555 +f 3605 3556 3604 +f 3605 3557 3556 +f 3606 3557 3605 +f 3606 3558 3557 +f 3607 3558 3606 +f 3607 3559 3558 +f 3608 3559 3607 +f 3608 3560 3559 +f 3609 3560 3608 +f 3609 3561 3560 +f 3610 3561 3609 +f 3610 3562 3561 +f 3611 3562 3610 +f 3611 3563 3562 +f 3612 3563 3611 +f 3612 3564 3563 +f 3613 3564 3612 +f 3613 3565 3564 +f 3614 3565 3613 +f 3614 3566 3565 +f 3615 3566 3614 +f 3615 3567 3566 +f 3616 3567 3615 +f 3616 3568 3567 +f 3617 3568 3616 +f 3617 3569 3568 +f 3618 3569 3617 +f 3618 3570 3569 +f 3619 3570 3618 +f 3619 3571 3570 +f 3620 3571 3619 +f 3620 3572 3571 +f 3620 3573 3572 +f 3621 3573 3620 +f 3622 3573 3621 +f 3622 3574 3573 +f 3623 3574 3622 +f 3623 3575 3574 +f 3623 3576 3575 +f 3624 3576 3623 +f 3625 3576 3624 +f 3625 3577 3576 +f 3626 3577 3625 +f 3626 3578 3577 +f 3627 3578 3626 +f 3627 3579 3578 +f 3628 3579 3627 +f 3628 3580 3579 +f 3629 3580 3628 +f 3629 3581 3580 +f 3630 3581 3629 +f 3630 3582 3581 +f 3631 3582 3630 +f 3631 3583 3582 +f 3632 3583 3631 +f 3632 3584 3583 +f 3633 3584 3632 +f 3633 3585 3584 +f 3634 3585 3633 +f 3634 3586 3585 +f 3635 3586 3634 +f 3635 3587 3586 +f 3635 3588 3587 +f 3636 3588 3635 +f 3637 3588 3636 +f 3637 3589 3588 +f 3638 3589 3637 +f 3638 3590 3589 +f 3639 3590 3638 +f 3639 3591 3590 +f 3640 3591 3639 +f 3640 3592 3591 +f 3641 3592 3640 +f 3641 3593 3592 +f 3595 3593 3641 +f 3595 3547 3593 +f 3642 885 3643 +f 3642 3644 885 +f 3645 3644 3642 +f 3645 3646 3644 +f 3647 3646 3645 +f 3647 3648 3646 +f 3649 3648 3647 +f 3649 3650 3648 +f 3649 3651 3650 +f 3652 3651 3649 +f 3653 3651 3652 +f 3653 3654 3651 +f 3655 3654 3653 +f 3655 3656 3654 +f 3657 3656 3655 +f 3657 3658 3656 +f 3659 3658 3657 +f 3659 3660 3658 +f 3659 3661 3660 +f 3662 3661 3659 +f 3663 3661 3662 +f 3663 3664 3661 +f 3665 3664 3663 +f 3665 3666 3664 +f 3667 3666 3665 +f 3667 3668 3666 +f 3669 3668 3667 +f 3669 3670 3668 +f 3671 3670 3669 +f 3671 3672 3670 +f 3673 3672 3671 +f 3673 3674 3672 +f 3675 3674 3673 +f 3675 3676 3674 +f 3677 3676 3675 +f 3677 3678 3676 +f 3679 3678 3677 +f 3679 3680 3678 +f 3681 3680 3679 +f 3681 3682 3680 +f 3683 3682 3681 +f 3683 3684 3682 +f 3685 3684 3683 +f 3685 3686 3684 +f 3687 3686 3685 +f 3687 3688 3686 +f 3689 3688 3687 +f 3689 901 3688 +f 3690 901 3689 +f 3690 3691 901 +f 3692 3691 3690 +f 3692 3693 3691 +f 3694 3693 3692 +f 3694 3695 3693 +f 3696 3695 3694 +f 3696 3697 3695 +f 3698 3697 3696 +f 3698 3699 3697 +f 3700 3699 3698 +f 3700 3701 3699 +f 3702 3701 3700 +f 3702 3703 3701 +f 3704 3703 3702 +f 3704 3705 3703 +f 3706 3705 3704 +f 3706 3707 3705 +f 3706 3708 3707 +f 3709 3708 3706 +f 3710 3708 3709 +f 3710 3711 3708 +f 3712 3711 3710 +f 3712 3713 3711 +f 3714 3713 3712 +f 3714 3715 3713 +f 3716 3715 3714 +f 3716 3717 3715 +f 3718 3717 3716 +f 3718 3719 3717 +f 3720 3719 3718 +f 3720 3721 3719 +f 3720 3722 3721 +f 3723 3722 3720 +f 3724 3722 3723 +f 3724 3725 3722 +f 3724 3726 3725 +f 3727 3726 3724 +f 3728 3726 3727 +f 3728 3729 3726 +f 3730 3729 3728 +f 3730 3731 3729 +f 3732 3731 3730 +f 3732 3733 3731 +f 3734 3733 3732 +f 3734 3735 3733 +f 3643 3735 3734 +f 3643 885 3735 +f 3736 3643 3737 +f 3736 3642 3643 +f 3738 3642 3736 +f 3738 3645 3642 +f 3739 3645 3738 +f 3739 3647 3645 +f 3740 3647 3739 +f 3740 3649 3647 +f 3741 3649 3740 +f 3741 3652 3649 +f 3742 3652 3741 +f 3742 3653 3652 +f 3743 3653 3742 +f 3743 3655 3653 +f 3744 3655 3743 +f 3744 3657 3655 +f 3745 3657 3744 +f 3745 3659 3657 +f 3746 3659 3745 +f 3746 3662 3659 +f 3747 3662 3746 +f 3747 3663 3662 +f 3748 3663 3747 +f 3748 3665 3663 +f 3749 3665 3748 +f 3749 3667 3665 +f 3750 3667 3749 +f 3750 3669 3667 +f 3751 3669 3750 +f 3751 3671 3669 +f 3752 3671 3751 +f 3752 3673 3671 +f 3753 3673 3752 +f 3753 3675 3673 +f 3754 3675 3753 +f 3754 3677 3675 +f 3755 3677 3754 +f 3755 3679 3677 +f 3756 3679 3755 +f 3756 3681 3679 +f 3757 3681 3756 +f 3757 3683 3681 +f 3758 3683 3757 +f 3758 3685 3683 +f 3759 3685 3758 +f 3759 3687 3685 +f 3760 3687 3759 +f 3760 3689 3687 +f 3761 3689 3760 +f 3761 3690 3689 +f 3762 3690 3761 +f 3762 3692 3690 +f 3763 3692 3762 +f 3763 3694 3692 +f 3764 3694 3763 +f 3764 3696 3694 +f 3765 3696 3764 +f 3765 3698 3696 +f 3766 3698 3765 +f 3766 3700 3698 +f 3767 3700 3766 +f 3767 3702 3700 +f 3768 3702 3767 +f 3768 3704 3702 +f 3769 3704 3768 +f 3769 3706 3704 +f 3770 3706 3769 +f 3770 3709 3706 +f 3771 3709 3770 +f 3771 3710 3709 +f 3772 3710 3771 +f 3772 3712 3710 +f 3773 3712 3772 +f 3773 3714 3712 +f 3774 3714 3773 +f 3774 3716 3714 +f 3775 3716 3774 +f 3775 3718 3716 +f 3776 3718 3775 +f 3776 3720 3718 +f 3777 3720 3776 +f 3777 3723 3720 +f 3778 3723 3777 +f 3778 3724 3723 +f 3779 3724 3778 +f 3779 3727 3724 +f 3780 3727 3779 +f 3780 3728 3727 +f 3781 3728 3780 +f 3781 3730 3728 +f 3782 3730 3781 +f 3782 3732 3730 +f 3783 3732 3782 +f 3783 3734 3732 +f 3737 3734 3783 +f 3737 3643 3734 +f 3784 3737 3785 +f 3784 3736 3737 +f 3786 3736 3784 +f 3786 3738 3736 +f 3787 3738 3786 +f 3787 3739 3738 +f 3788 3739 3787 +f 3788 3740 3739 +f 3789 3740 3788 +f 3789 3741 3740 +f 3790 3741 3789 +f 3790 3742 3741 +f 3791 3742 3790 +f 3791 3743 3742 +f 3792 3743 3791 +f 3792 3744 3743 +f 3793 3744 3792 +f 3793 3745 3744 +f 3794 3745 3793 +f 3794 3746 3745 +f 3795 3746 3794 +f 3795 3747 3746 +f 3796 3747 3795 +f 3796 3748 3747 +f 3797 3748 3796 +f 3797 3749 3748 +f 3798 3749 3797 +f 3798 3750 3749 +f 3799 3750 3798 +f 3799 3751 3750 +f 3800 3751 3799 +f 3800 3752 3751 +f 3801 3752 3800 +f 3801 3753 3752 +f 3802 3753 3801 +f 3802 3754 3753 +f 3803 3754 3802 +f 3803 3755 3754 +f 3804 3755 3803 +f 3804 3756 3755 +f 3805 3756 3804 +f 3805 3757 3756 +f 3806 3757 3805 +f 3806 3758 3757 +f 3807 3758 3806 +f 3807 3759 3758 +f 3808 3759 3807 +f 3808 3760 3759 +f 3809 3760 3808 +f 3809 3761 3760 +f 3810 3761 3809 +f 3810 3762 3761 +f 3811 3762 3810 +f 3811 3763 3762 +f 3812 3763 3811 +f 3812 3764 3763 +f 3813 3764 3812 +f 3813 3765 3764 +f 3814 3765 3813 +f 3814 3766 3765 +f 3815 3766 3814 +f 3815 3767 3766 +f 3816 3767 3815 +f 3816 3768 3767 +f 3817 3768 3816 +f 3817 3769 3768 +f 3818 3769 3817 +f 3818 3770 3769 +f 3819 3770 3818 +f 3819 3771 3770 +f 3820 3771 3819 +f 3820 3772 3771 +f 3821 3772 3820 +f 3821 3773 3772 +f 3822 3773 3821 +f 3822 3774 3773 +f 3823 3774 3822 +f 3823 3775 3774 +f 3824 3775 3823 +f 3824 3776 3775 +f 3825 3776 3824 +f 3825 3777 3776 +f 3826 3777 3825 +f 3826 3778 3777 +f 3827 3778 3826 +f 3827 3779 3778 +f 3828 3779 3827 +f 3828 3780 3779 +f 3829 3780 3828 +f 3829 3781 3780 +f 3830 3781 3829 +f 3830 3782 3781 +f 3831 3782 3830 +f 3831 3783 3782 +f 3785 3783 3831 +f 3785 3737 3783 +f 3832 3785 3833 +f 3832 3784 3785 +f 3834 3784 3832 +f 3834 3786 3784 +f 3835 3786 3834 +f 3835 3787 3786 +f 3836 3787 3835 +f 3836 3788 3787 +f 3837 3788 3836 +f 3837 3789 3788 +f 3838 3789 3837 +f 3838 3790 3789 +f 3839 3790 3838 +f 3839 3791 3790 +f 3840 3791 3839 +f 3840 3792 3791 +f 3841 3792 3840 +f 3841 3793 3792 +f 3842 3793 3841 +f 3842 3794 3793 +f 3843 3794 3842 +f 3843 3795 3794 +f 3844 3795 3843 +f 3844 3796 3795 +f 3845 3796 3844 +f 3845 3797 3796 +f 3846 3797 3845 +f 3846 3798 3797 +f 3847 3798 3846 +f 3847 3799 3798 +f 3848 3799 3847 +f 3848 3800 3799 +f 3849 3800 3848 +f 3849 3801 3800 +f 3850 3801 3849 +f 3850 3802 3801 +f 3851 3802 3850 +f 3851 3803 3802 +f 3852 3803 3851 +f 3852 3804 3803 +f 3853 3804 3852 +f 3853 3805 3804 +f 3854 3805 3853 +f 3854 3806 3805 +f 3855 3806 3854 +f 3855 3807 3806 +f 3856 3807 3855 +f 3856 3808 3807 +f 3857 3808 3856 +f 3857 3809 3808 +f 3858 3809 3857 +f 3858 3810 3809 +f 3859 3810 3858 +f 3859 3811 3810 +f 3860 3811 3859 +f 3860 3812 3811 +f 3861 3812 3860 +f 3861 3813 3812 +f 3862 3813 3861 +f 3862 3814 3813 +f 3863 3814 3862 +f 3863 3815 3814 +f 3864 3815 3863 +f 3864 3816 3815 +f 3865 3816 3864 +f 3865 3817 3816 +f 3866 3817 3865 +f 3866 3818 3817 +f 3867 3818 3866 +f 3867 3819 3818 +f 3868 3819 3867 +f 3868 3820 3819 +f 3869 3820 3868 +f 3869 3821 3820 +f 3870 3821 3869 +f 3870 3822 3821 +f 3871 3822 3870 +f 3871 3823 3822 +f 3872 3823 3871 +f 3872 3824 3823 +f 3873 3824 3872 +f 3873 3825 3824 +f 3874 3825 3873 +f 3874 3826 3825 +f 3875 3826 3874 +f 3875 3827 3826 +f 3876 3827 3875 +f 3876 3828 3827 +f 3877 3828 3876 +f 3877 3829 3828 +f 3878 3829 3877 +f 3878 3830 3829 +f 3879 3830 3878 +f 3879 3831 3830 +f 3833 3831 3879 +f 3833 3785 3831 +f 3880 3833 3881 +f 3880 3832 3833 +f 3882 3832 3880 +f 3882 3834 3832 +f 3883 3834 3882 +f 3883 3835 3834 +f 3884 3835 3883 +f 3884 3836 3835 +f 3885 3836 3884 +f 3885 3837 3836 +f 3886 3837 3885 +f 3886 3838 3837 +f 3887 3838 3886 +f 3887 3839 3838 +f 3888 3839 3887 +f 3888 3840 3839 +f 3889 3840 3888 +f 3889 3841 3840 +f 3890 3841 3889 +f 3890 3842 3841 +f 3891 3842 3890 +f 3891 3843 3842 +f 3892 3843 3891 +f 3892 3844 3843 +f 3893 3844 3892 +f 3893 3845 3844 +f 3894 3845 3893 +f 3894 3846 3845 +f 3895 3846 3894 +f 3895 3847 3846 +f 3896 3847 3895 +f 3896 3848 3847 +f 3897 3848 3896 +f 3897 3849 3848 +f 3898 3849 3897 +f 3898 3850 3849 +f 3899 3850 3898 +f 3899 3851 3850 +f 3900 3851 3899 +f 3900 3852 3851 +f 3901 3852 3900 +f 3901 3853 3852 +f 3902 3853 3901 +f 3902 3854 3853 +f 3903 3854 3902 +f 3903 3855 3854 +f 3904 3855 3903 +f 3904 3856 3855 +f 3905 3856 3904 +f 3905 3857 3856 +f 3906 3857 3905 +f 3906 3858 3857 +f 3907 3858 3906 +f 3907 3859 3858 +f 3908 3859 3907 +f 3908 3860 3859 +f 3909 3860 3908 +f 3909 3861 3860 +f 3910 3861 3909 +f 3910 3862 3861 +f 3911 3862 3910 +f 3911 3863 3862 +f 3912 3863 3911 +f 3912 3864 3863 +f 3913 3864 3912 +f 3913 3865 3864 +f 3914 3865 3913 +f 3914 3866 3865 +f 3915 3866 3914 +f 3915 3867 3866 +f 3916 3867 3915 +f 3916 3868 3867 +f 3917 3868 3916 +f 3917 3869 3868 +f 3918 3869 3917 +f 3918 3870 3869 +f 3919 3870 3918 +f 3919 3871 3870 +f 3920 3871 3919 +f 3920 3872 3871 +f 3921 3872 3920 +f 3921 3873 3872 +f 3922 3873 3921 +f 3922 3874 3873 +f 3923 3874 3922 +f 3923 3875 3874 +f 3924 3875 3923 +f 3924 3876 3875 +f 3925 3876 3924 +f 3925 3877 3876 +f 3926 3877 3925 +f 3926 3878 3877 +f 3927 3878 3926 +f 3927 3879 3878 +f 3881 3879 3927 +f 3881 3833 3879 +f 3928 3881 3929 +f 3928 3880 3881 +f 3930 3880 3928 +f 3930 3882 3880 +f 3931 3882 3930 +f 3931 3883 3882 +f 3932 3883 3931 +f 3932 3884 3883 +f 3933 3884 3932 +f 3933 3885 3884 +f 3934 3885 3933 +f 3934 3886 3885 +f 3935 3886 3934 +f 3935 3887 3886 +f 3936 3887 3935 +f 3936 3888 3887 +f 3937 3888 3936 +f 3937 3889 3888 +f 3938 3889 3937 +f 3938 3890 3889 +f 3939 3890 3938 +f 3939 3891 3890 +f 3940 3891 3939 +f 3940 3892 3891 +f 3941 3892 3940 +f 3941 3893 3892 +f 3942 3893 3941 +f 3942 3894 3893 +f 3943 3894 3942 +f 3943 3895 3894 +f 3944 3895 3943 +f 3944 3896 3895 +f 3945 3896 3944 +f 3945 3897 3896 +f 3946 3897 3945 +f 3946 3898 3897 +f 3947 3898 3946 +f 3947 3899 3898 +f 3948 3899 3947 +f 3948 3900 3899 +f 3949 3900 3948 +f 3949 3901 3900 +f 3950 3901 3949 +f 3950 3902 3901 +f 3951 3902 3950 +f 3951 3903 3902 +f 3951 3904 3903 +f 3952 3904 3951 +f 3953 3904 3952 +f 3953 3905 3904 +f 3954 3905 3953 +f 3954 3906 3905 +f 3955 3906 3954 +f 3955 3907 3906 +f 3956 3907 3955 +f 3956 3908 3907 +f 3957 3908 3956 +f 3957 3909 3908 +f 3958 3909 3957 +f 3958 3910 3909 +f 3959 3910 3958 +f 3959 3911 3910 +f 3960 3911 3959 +f 3960 3912 3911 +f 3961 3912 3960 +f 3961 3913 3912 +f 3962 3913 3961 +f 3962 3914 3913 +f 3963 3914 3962 +f 3963 3915 3914 +f 3964 3915 3963 +f 3964 3916 3915 +f 3965 3916 3964 +f 3965 3917 3916 +f 3966 3917 3965 +f 3966 3918 3917 +f 3967 3918 3966 +f 3967 3919 3918 +f 3968 3919 3967 +f 3968 3920 3919 +f 3969 3920 3968 +f 3969 3921 3920 +f 3970 3921 3969 +f 3970 3922 3921 +f 3971 3922 3970 +f 3971 3923 3922 +f 3972 3923 3971 +f 3972 3924 3923 +f 3973 3924 3972 +f 3973 3925 3924 +f 3974 3925 3973 +f 3974 3926 3925 +f 3975 3926 3974 +f 3975 3927 3926 +f 3929 3927 3975 +f 3929 3881 3927 +f 3976 3977 1029 +f 3978 3977 3976 +f 3979 3977 3978 +f 3979 3980 3977 +f 3981 3980 3979 +f 3981 3982 3980 +f 3983 3982 3981 +f 3983 3984 3982 +f 3985 3984 3983 +f 3985 3986 3984 +f 3987 3986 3985 +f 3987 3988 3986 +f 3989 3988 3987 +f 3989 3990 3988 +f 3991 3990 3989 +f 3991 3992 3990 +f 3993 3992 3991 +f 3993 3994 3992 +f 3993 3995 3994 +f 3996 3995 3993 +f 3997 3995 3996 +f 3997 3998 3995 +f 3999 3998 3997 +f 3999 4000 3998 +f 4001 4000 3999 +f 4001 4002 4000 +f 4003 4002 4001 +f 4003 4004 4002 +f 4005 4004 4003 +f 4005 4006 4004 +f 4007 4006 4005 +f 4007 4008 4006 +f 4009 4008 4007 +f 4009 4010 4008 +f 4011 4010 4009 +f 4011 4012 4010 +f 4013 4012 4011 +f 4013 4014 4012 +f 4015 4014 4013 +f 4015 4016 4014 +f 4017 4016 4015 +f 4017 4018 4016 +f 4019 4018 4017 +f 4019 4020 4018 +f 4021 4020 4019 +f 4021 4022 4020 +f 4023 4022 4021 +f 4023 4024 4022 +f 4025 4024 4023 +f 4025 4026 4024 +f 4027 4026 4025 +f 4027 4028 4026 +f 4029 4028 4027 +f 4029 4030 4028 +f 4031 4030 4029 +f 4031 4032 4030 +f 4033 4032 4031 +f 4033 4034 4032 +f 4035 4034 4033 +f 4035 4036 4034 +f 4037 4036 4035 +f 4037 4038 4036 +f 4039 4038 4037 +f 4039 4040 4038 +f 4041 4040 4039 +f 4041 4042 4040 +f 4043 4042 4041 +f 4043 4044 4042 +f 4045 4044 4043 +f 4045 4046 4044 +f 4047 4046 4045 +f 4047 4048 4046 +f 4049 4048 4047 +f 4049 4050 4048 +f 4051 4050 4049 +f 4051 4052 4050 +f 4053 4052 4051 +f 4053 4054 4052 +f 4053 4055 4054 +f 4056 4055 4053 +f 4056 4057 4055 +f 4058 4057 4056 +f 4059 4057 4058 +f 4059 4060 4057 +f 4059 4061 4060 +f 4062 4061 4059 +f 4063 4061 4062 +f 4063 4064 4061 +f 4065 4064 4063 +f 4065 4066 4064 +f 4067 4066 4065 +f 4067 4068 4066 +f 4069 4068 4067 +f 4069 4070 4068 +f 3976 4070 4069 +f 3976 1029 4070 +f 4071 3976 4072 +f 4071 3978 3976 +f 4073 3978 4071 +f 4073 3979 3978 +f 4074 3979 4073 +f 4074 3981 3979 +f 4075 3981 4074 +f 4075 3983 3981 +f 4076 3983 4075 +f 4076 3985 3983 +f 4077 3985 4076 +f 4077 3987 3985 +f 4078 3987 4077 +f 4078 3989 3987 +f 4079 3989 4078 +f 4079 3991 3989 +f 4080 3991 4079 +f 4080 3993 3991 +f 4081 3993 4080 +f 4081 3996 3993 +f 4082 3996 4081 +f 4082 3997 3996 +f 4083 3997 4082 +f 4083 3999 3997 +f 4084 3999 4083 +f 4084 4001 3999 +f 4085 4001 4084 +f 4085 4003 4001 +f 4086 4003 4085 +f 4086 4005 4003 +f 4087 4005 4086 +f 4087 4007 4005 +f 4088 4007 4087 +f 4088 4009 4007 +f 4089 4009 4088 +f 4089 4011 4009 +f 4090 4011 4089 +f 4090 4013 4011 +f 4091 4013 4090 +f 4091 4015 4013 +f 4092 4015 4091 +f 4092 4017 4015 +f 4093 4017 4092 +f 4093 4019 4017 +f 4094 4019 4093 +f 4094 4021 4019 +f 4095 4021 4094 +f 4095 4023 4021 +f 4096 4023 4095 +f 4096 4025 4023 +f 4097 4025 4096 +f 4097 4027 4025 +f 4098 4027 4097 +f 4098 4029 4027 +f 4099 4029 4098 +f 4099 4031 4029 +f 4100 4031 4099 +f 4100 4033 4031 +f 4101 4033 4100 +f 4101 4035 4033 +f 4102 4035 4101 +f 4102 4037 4035 +f 4103 4037 4102 +f 4103 4039 4037 +f 4104 4039 4103 +f 4104 4041 4039 +f 4105 4041 4104 +f 4105 4043 4041 +f 4106 4043 4105 +f 4106 4045 4043 +f 4107 4045 4106 +f 4107 4047 4045 +f 4108 4047 4107 +f 4108 4049 4047 +f 4109 4049 4108 +f 4109 4051 4049 +f 4110 4051 4109 +f 4110 4053 4051 +f 4111 4053 4110 +f 4111 4056 4053 +f 4112 4056 4111 +f 4112 4058 4056 +f 4113 4058 4112 +f 4113 4059 4058 +f 4114 4059 4113 +f 4114 4062 4059 +f 4115 4062 4114 +f 4115 4063 4062 +f 4116 4063 4115 +f 4116 4065 4063 +f 4117 4065 4116 +f 4117 4067 4065 +f 4118 4067 4117 +f 4118 4069 4067 +f 4072 4069 4118 +f 4072 3976 4069 +f 4119 4072 4120 +f 4119 4071 4072 +f 4121 4071 4119 +f 4121 4073 4071 +f 4122 4073 4121 +f 4122 4074 4073 +f 4123 4074 4122 +f 4123 4075 4074 +f 4124 4075 4123 +f 4124 4076 4075 +f 4125 4076 4124 +f 4125 4077 4076 +f 4126 4077 4125 +f 4126 4078 4077 +f 4127 4078 4126 +f 4127 4079 4078 +f 4128 4079 4127 +f 4128 4080 4079 +f 4129 4080 4128 +f 4129 4081 4080 +f 4130 4081 4129 +f 4130 4082 4081 +f 4131 4082 4130 +f 4131 4083 4082 +f 4132 4083 4131 +f 4132 4084 4083 +f 4133 4084 4132 +f 4133 4085 4084 +f 4134 4085 4133 +f 4134 4086 4085 +f 4135 4086 4134 +f 4135 4087 4086 +f 4136 4087 4135 +f 4136 4088 4087 +f 4137 4088 4136 +f 4137 4089 4088 +f 4138 4089 4137 +f 4138 4090 4089 +f 4139 4090 4138 +f 4139 4091 4090 +f 4140 4091 4139 +f 4140 4092 4091 +f 4141 4092 4140 +f 4141 4093 4092 +f 4142 4093 4141 +f 4142 4094 4093 +f 4143 4094 4142 +f 4143 4095 4094 +f 4144 4095 4143 +f 4144 4096 4095 +f 4145 4096 4144 +f 4145 4097 4096 +f 4146 4097 4145 +f 4146 4098 4097 +f 4147 4098 4146 +f 4147 4099 4098 +f 4148 4099 4147 +f 4148 4100 4099 +f 4149 4100 4148 +f 4149 4101 4100 +f 4150 4101 4149 +f 4150 4102 4101 +f 4151 4102 4150 +f 4151 4103 4102 +f 4152 4103 4151 +f 4152 4104 4103 +f 4153 4104 4152 +f 4153 4105 4104 +f 4154 4105 4153 +f 4154 4106 4105 +f 4155 4106 4154 +f 4155 4107 4106 +f 4156 4107 4155 +f 4156 4108 4107 +f 4157 4108 4156 +f 4157 4109 4108 +f 4158 4109 4157 +f 4158 4110 4109 +f 4159 4110 4158 +f 4159 4111 4110 +f 4160 4111 4159 +f 4160 4112 4111 +f 4161 4112 4160 +f 4161 4113 4112 +f 4162 4113 4161 +f 4162 4114 4113 +f 4163 4114 4162 +f 4163 4115 4114 +f 4164 4115 4163 +f 4164 4116 4115 +f 4165 4116 4164 +f 4165 4117 4116 +f 4166 4117 4165 +f 4166 4118 4117 +f 4120 4118 4166 +f 4120 4072 4118 +f 4167 4120 4168 +f 4167 4119 4120 +f 4169 4119 4167 +f 4169 4121 4119 +f 4170 4121 4169 +f 4170 4122 4121 +f 4171 4122 4170 +f 4171 4123 4122 +f 4172 4123 4171 +f 4172 4124 4123 +f 4173 4124 4172 +f 4173 4125 4124 +f 4174 4125 4173 +f 4174 4126 4125 +f 4175 4126 4174 +f 4175 4127 4126 +f 4176 4127 4175 +f 4176 4128 4127 +f 4177 4128 4176 +f 4177 4129 4128 +f 4178 4129 4177 +f 4178 4130 4129 +f 4179 4130 4178 +f 4179 4131 4130 +f 4180 4131 4179 +f 4180 4132 4131 +f 4181 4132 4180 +f 4181 4133 4132 +f 4182 4133 4181 +f 4182 4134 4133 +f 4183 4134 4182 +f 4183 4135 4134 +f 4184 4135 4183 +f 4184 4136 4135 +f 4185 4136 4184 +f 4185 4137 4136 +f 4186 4137 4185 +f 4186 4138 4137 +f 4187 4138 4186 +f 4187 4139 4138 +f 4188 4139 4187 +f 4188 4140 4139 +f 4189 4140 4188 +f 4189 4141 4140 +f 4190 4141 4189 +f 4190 4142 4141 +f 4191 4142 4190 +f 4191 4143 4142 +f 4192 4143 4191 +f 4192 4144 4143 +f 4193 4144 4192 +f 4193 4145 4144 +f 4194 4145 4193 +f 4194 4146 4145 +f 4195 4146 4194 +f 4195 4147 4146 +f 4196 4147 4195 +f 4196 4148 4147 +f 4197 4148 4196 +f 4197 4149 4148 +f 4198 4149 4197 +f 4198 4150 4149 +f 4199 4150 4198 +f 4199 4151 4150 +f 4200 4151 4199 +f 4200 4152 4151 +f 4201 4152 4200 +f 4201 4153 4152 +f 4202 4153 4201 +f 4202 4154 4153 +f 4203 4154 4202 +f 4203 4155 4154 +f 4204 4155 4203 +f 4204 4156 4155 +f 4205 4156 4204 +f 4205 4157 4156 +f 4206 4157 4205 +f 4206 4158 4157 +f 4207 4158 4206 +f 4207 4159 4158 +f 4208 4159 4207 +f 4208 4160 4159 +f 4209 4160 4208 +f 4209 4161 4160 +f 4210 4161 4209 +f 4210 4162 4161 +f 4211 4162 4210 +f 4211 4163 4162 +f 4212 4163 4211 +f 4212 4164 4163 +f 4213 4164 4212 +f 4213 4165 4164 +f 4214 4165 4213 +f 4214 4166 4165 +f 4168 4166 4214 +f 4168 4120 4166 +f 4215 4168 4216 +f 4215 4167 4168 +f 4217 4167 4215 +f 4217 4169 4167 +f 4218 4169 4217 +f 4218 4170 4169 +f 4219 4170 4218 +f 4219 4171 4170 +f 4220 4171 4219 +f 4220 4172 4171 +f 4221 4172 4220 +f 4221 4173 4172 +f 4222 4173 4221 +f 4222 4174 4173 +f 4223 4174 4222 +f 4223 4175 4174 +f 4224 4175 4223 +f 4224 4176 4175 +f 4225 4176 4224 +f 4225 4177 4176 +f 4226 4177 4225 +f 4226 4178 4177 +f 4227 4178 4226 +f 4227 4179 4178 +f 4228 4179 4227 +f 4228 4180 4179 +f 4229 4180 4228 +f 4229 4181 4180 +f 4230 4181 4229 +f 4230 4182 4181 +f 4231 4182 4230 +f 4231 4183 4182 +f 4232 4183 4231 +f 4232 4184 4183 +f 4233 4184 4232 +f 4233 4185 4184 +f 4234 4185 4233 +f 4234 4186 4185 +f 4235 4186 4234 +f 4235 4187 4186 +f 4236 4187 4235 +f 4236 4188 4187 +f 4237 4188 4236 +f 4237 4189 4188 +f 4238 4189 4237 +f 4238 4190 4189 +f 4239 4190 4238 +f 4239 4191 4190 +f 4240 4191 4239 +f 4240 4192 4191 +f 4241 4192 4240 +f 4241 4193 4192 +f 4242 4193 4241 +f 4242 4194 4193 +f 4243 4194 4242 +f 4243 4195 4194 +f 4244 4195 4243 +f 4244 4196 4195 +f 4245 4196 4244 +f 4245 4197 4196 +f 4246 4197 4245 +f 4246 4198 4197 +f 4247 4198 4246 +f 4247 4199 4198 +f 4248 4199 4247 +f 4248 4200 4199 +f 4249 4200 4248 +f 4249 4201 4200 +f 4250 4201 4249 +f 4250 4202 4201 +f 4251 4202 4250 +f 4251 4203 4202 +f 4252 4203 4251 +f 4252 4204 4203 +f 4253 4204 4252 +f 4253 4205 4204 +f 4254 4205 4253 +f 4254 4206 4205 +f 4255 4206 4254 +f 4255 4207 4206 +f 4256 4207 4255 +f 4256 4208 4207 +f 4257 4208 4256 +f 4257 4209 4208 +f 4258 4209 4257 +f 4258 4210 4209 +f 4259 4210 4258 +f 4259 4211 4210 +f 4260 4211 4259 +f 4260 4212 4211 +f 4261 4212 4260 +f 4261 4213 4212 +f 4262 4213 4261 +f 4262 4214 4213 +f 4216 4214 4262 +f 4216 4168 4214 +f 4263 4216 4264 +f 4263 4215 4216 +f 4265 4215 4263 +f 4265 4217 4215 +f 4266 4217 4265 +f 4266 4218 4217 +f 4267 4218 4266 +f 4267 4219 4218 +f 4268 4219 4267 +f 4268 4220 4219 +f 4269 4220 4268 +f 4269 4221 4220 +f 4270 4221 4269 +f 4270 4222 4221 +f 4271 4222 4270 +f 4271 4223 4222 +f 4272 4223 4271 +f 4272 4224 4223 +f 4273 4224 4272 +f 4273 4225 4224 +f 4274 4225 4273 +f 4274 4226 4225 +f 4275 4226 4274 +f 4275 4227 4226 +f 4276 4227 4275 +f 4276 4228 4227 +f 4277 4228 4276 +f 4277 4229 4228 +f 4278 4229 4277 +f 4278 4230 4229 +f 4279 4230 4278 +f 4279 4231 4230 +f 4280 4231 4279 +f 4280 4232 4231 +f 4281 4232 4280 +f 4281 4233 4232 +f 4282 4233 4281 +f 4282 4234 4233 +f 4283 4234 4282 +f 4283 4235 4234 +f 4284 4235 4283 +f 4284 4236 4235 +f 4285 4236 4284 +f 4285 4237 4236 +f 4286 4237 4285 +f 4286 4238 4237 +f 4287 4238 4286 +f 4287 4239 4238 +f 4288 4239 4287 +f 4288 4240 4239 +f 4289 4240 4288 +f 4289 4241 4240 +f 4290 4241 4289 +f 4290 4242 4241 +f 4291 4242 4290 +f 4291 4243 4242 +f 4292 4243 4291 +f 4292 4244 4243 +f 4293 4244 4292 +f 4293 4245 4244 +f 4294 4245 4293 +f 4294 4246 4245 +f 4295 4246 4294 +f 4295 4247 4246 +f 4296 4247 4295 +f 4296 4248 4247 +f 4297 4248 4296 +f 4297 4249 4248 +f 4298 4249 4297 +f 4298 4250 4249 +f 4299 4250 4298 +f 4299 4251 4250 +f 4300 4251 4299 +f 4300 4252 4251 +f 4301 4252 4300 +f 4301 4253 4252 +f 4302 4253 4301 +f 4302 4254 4253 +f 4303 4254 4302 +f 4303 4255 4254 +f 4304 4255 4303 +f 4304 4256 4255 +f 4305 4256 4304 +f 4305 4257 4256 +f 4306 4257 4305 +f 4306 4258 4257 +f 4307 4258 4306 +f 4307 4259 4258 +f 4308 4259 4307 +f 4308 4260 4259 +f 4309 4260 4308 +f 4309 4261 4260 +f 4310 4261 4309 +f 4310 4262 4261 +f 4264 4262 4310 +f 4264 4216 4262 +f 4311 1056 1010 +f 4312 1056 4311 +f 4313 1056 4312 +f 4313 1055 1056 +f 4314 1055 4313 +f 4314 1054 1055 +f 4315 1054 4314 +f 4315 1053 1054 +f 4316 1053 4315 +f 4316 1052 1053 +f 4317 1052 4316 +f 4317 1051 1052 +f 4318 1051 4317 +f 4318 1050 1051 +f 4319 1050 4318 +f 4319 1049 1050 +f 4320 1049 4319 +f 4320 1048 1049 +f 4321 1048 4320 +f 4321 1047 1048 +f 4322 1047 4321 +f 4322 1046 1047 +f 4322 1045 1046 +f 4323 1045 4322 +f 4324 1045 4323 +f 4324 1044 1045 +f 4325 1044 4324 +f 4325 1043 1044 +f 4326 1043 4325 +f 4326 1042 1043 +f 4327 1042 4326 +f 4327 1041 1042 +f 4328 1041 4327 +f 4328 1040 1041 +f 4329 1040 4328 +f 4329 1039 1040 +f 4330 1039 4329 +f 4330 1038 1039 +f 4331 1038 4330 +f 4331 1037 1038 +f 4332 1037 4331 +f 4332 1036 1037 +f 4333 1036 4332 +f 4333 1035 1036 +f 4334 1035 4333 +f 4334 1034 1035 +f 4335 1034 4334 +f 4335 1033 1034 +f 4336 1033 4335 +f 4336 1032 1033 +f 4337 1032 4336 +f 4337 1031 1032 +f 4337 1030 1031 +f 4338 1030 4337 +f 4339 1030 4338 +f 4339 1029 1030 +f 4340 1029 4339 +f 4340 1028 1029 +f 4341 1028 4340 +f 4341 1027 1028 +f 4342 1027 4341 +f 4342 1026 1027 +f 4343 1026 4342 +f 4343 1025 1026 +f 4344 1025 4343 +f 4344 1024 1025 +f 4345 1024 4344 +f 4345 1023 1024 +f 4346 1023 4345 +f 4346 1022 1023 +f 4347 1022 4346 +f 4347 1021 1022 +f 4348 1021 4347 +f 4348 1020 1021 +f 4349 1020 4348 +f 4349 1019 1020 +f 4350 1019 4349 +f 4350 1018 1019 +f 4351 1018 4350 +f 4351 1017 1018 +f 4352 1017 4351 +f 4352 1016 1017 +f 4352 1015 1016 +f 4353 1015 4352 +f 4354 1015 4353 +f 4354 1014 1015 +f 4355 1014 4354 +f 4355 1013 1014 +f 4356 1013 4355 +f 4356 1012 1013 +f 4357 1012 4356 +f 4357 1011 1012 +f 4358 1011 4357 +f 4358 1009 1011 +f 4311 1009 4358 +f 4311 1010 1009 +f 4359 4311 4360 +f 4359 4312 4311 +f 4361 4312 4359 +f 4361 4313 4312 +f 4362 4313 4361 +f 4362 4314 4313 +f 4363 4314 4362 +f 4363 4315 4314 +f 4364 4315 4363 +f 4364 4316 4315 +f 4365 4316 4364 +f 4365 4317 4316 +f 4366 4317 4365 +f 4366 4318 4317 +f 4367 4318 4366 +f 4367 4319 4318 +f 4368 4319 4367 +f 4368 4320 4319 +f 4369 4320 4368 +f 4369 4321 4320 +f 4370 4321 4369 +f 4370 4322 4321 +f 4371 4322 4370 +f 4371 4323 4322 +f 4372 4323 4371 +f 4372 4324 4323 +f 4373 4324 4372 +f 4373 4325 4324 +f 4373 4326 4325 +f 4374 4326 4373 +f 4375 4326 4374 +f 4375 4327 4326 +f 4376 4327 4375 +f 4376 4328 4327 +f 4376 4329 4328 +f 4377 4329 4376 +f 4378 4329 4377 +f 4378 4330 4329 +f 4379 4330 4378 +f 4379 4331 4330 +f 4380 4331 4379 +f 4380 4332 4331 +f 4381 4332 4380 +f 4381 4333 4332 +f 4382 4333 4381 +f 4382 4334 4333 +f 4383 4334 4382 +f 4383 4335 4334 +f 4384 4335 4383 +f 4384 4336 4335 +f 4385 4336 4384 +f 4385 4337 4336 +f 4386 4337 4385 +f 4386 4338 4337 +f 4387 4338 4386 +f 4387 4339 4338 +f 4388 4339 4387 +f 4388 4340 4339 +f 4389 4340 4388 +f 4389 4341 4340 +f 4390 4341 4389 +f 4390 4342 4341 +f 4391 4342 4390 +f 4391 4343 4342 +f 4392 4343 4391 +f 4392 4344 4343 +f 4393 4344 4392 +f 4393 4345 4344 +f 4394 4345 4393 +f 4394 4346 4345 +f 4395 4346 4394 +f 4395 4347 4346 +f 4396 4347 4395 +f 4396 4348 4347 +f 4397 4348 4396 +f 4397 4349 4348 +f 4398 4349 4397 +f 4398 4350 4349 +f 4399 4350 4398 +f 4399 4351 4350 +f 4400 4351 4399 +f 4400 4352 4351 +f 4401 4352 4400 +f 4401 4353 4352 +f 4402 4353 4401 +f 4402 4354 4353 +f 4403 4354 4402 +f 4403 4355 4354 +f 4404 4355 4403 +f 4404 4356 4355 +f 4405 4356 4404 +f 4405 4357 4356 +f 4406 4357 4405 +f 4406 4358 4357 +f 4360 4358 4406 +f 4360 4311 4358 +f 4407 4360 4408 +f 4407 4359 4360 +f 4409 4359 4407 +f 4409 4361 4359 +f 4410 4361 4409 +f 4410 4362 4361 +f 4411 4362 4410 +f 4411 4363 4362 +f 4412 4363 4411 +f 4412 4364 4363 +f 4413 4364 4412 +f 4413 4365 4364 +f 4414 4365 4413 +f 4414 4366 4365 +f 4415 4366 4414 +f 4415 4367 4366 +f 4416 4367 4415 +f 4416 4368 4367 +f 4417 4368 4416 +f 4417 4369 4368 +f 4418 4369 4417 +f 4418 4370 4369 +f 4419 4370 4418 +f 4419 4371 4370 +f 4420 4371 4419 +f 4420 4372 4371 +f 4421 4372 4420 +f 4421 4373 4372 +f 4422 4373 4421 +f 4422 4374 4373 +f 4422 4375 4374 +f 4423 4375 4422 +f 4424 4375 4423 +f 4424 4376 4375 +f 4425 4376 4424 +f 4425 4377 4376 +f 4426 4377 4425 +f 4426 4378 4377 +f 4427 4378 4426 +f 4427 4379 4378 +f 4428 4379 4427 +f 4428 4380 4379 +f 4429 4380 4428 +f 4429 4381 4380 +f 4430 4381 4429 +f 4430 4382 4381 +f 4431 4382 4430 +f 4431 4383 4382 +f 4432 4383 4431 +f 4432 4384 4383 +f 4433 4384 4432 +f 4433 4385 4384 +f 4434 4385 4433 +f 4434 4386 4385 +f 4435 4386 4434 +f 4435 4387 4386 +f 4436 4387 4435 +f 4436 4388 4387 +f 4437 4388 4436 +f 4437 4389 4388 +f 4438 4389 4437 +f 4438 4390 4389 +f 4439 4390 4438 +f 4439 4391 4390 +f 4440 4391 4439 +f 4440 4392 4391 +f 4441 4392 4440 +f 4441 4393 4392 +f 4442 4393 4441 +f 4442 4394 4393 +f 4443 4394 4442 +f 4443 4395 4394 +f 4444 4395 4443 +f 4444 4396 4395 +f 4445 4396 4444 +f 4445 4397 4396 +f 4446 4397 4445 +f 4446 4398 4397 +f 4447 4398 4446 +f 4447 4399 4398 +f 4448 4399 4447 +f 4448 4400 4399 +f 4449 4400 4448 +f 4449 4401 4400 +f 4450 4401 4449 +f 4450 4402 4401 +f 4451 4402 4450 +f 4451 4403 4402 +f 4452 4403 4451 +f 4452 4404 4403 +f 4453 4404 4452 +f 4453 4405 4404 +f 4454 4405 4453 +f 4454 4406 4405 +f 4408 4406 4454 +f 4408 4360 4406 +f 4455 4408 4456 +f 4455 4407 4408 +f 4457 4407 4455 +f 4457 4409 4407 +f 4458 4409 4457 +f 4458 4410 4409 +f 4459 4410 4458 +f 4459 4411 4410 +f 4460 4411 4459 +f 4460 4412 4411 +f 4461 4412 4460 +f 4461 4413 4412 +f 4462 4413 4461 +f 4462 4414 4413 +f 4463 4414 4462 +f 4463 4415 4414 +f 4464 4415 4463 +f 4464 4416 4415 +f 4465 4416 4464 +f 4465 4417 4416 +f 4466 4417 4465 +f 4466 4418 4417 +f 4467 4418 4466 +f 4467 4419 4418 +f 4468 4419 4467 +f 4468 4420 4419 +f 4469 4420 4468 +f 4469 4421 4420 +f 4470 4421 4469 +f 4470 4422 4421 +f 4471 4422 4470 +f 4471 4423 4422 +f 4472 4423 4471 +f 4472 4424 4423 +f 4473 4424 4472 +f 4473 4425 4424 +f 4474 4425 4473 +f 4474 4426 4425 +f 4475 4426 4474 +f 4475 4427 4426 +f 4476 4427 4475 +f 4476 4428 4427 +f 4477 4428 4476 +f 4477 4429 4428 +f 4478 4429 4477 +f 4478 4430 4429 +f 4479 4430 4478 +f 4479 4431 4430 +f 4480 4431 4479 +f 4480 4432 4431 +f 4481 4432 4480 +f 4481 4433 4432 +f 4482 4433 4481 +f 4482 4434 4433 +f 4483 4434 4482 +f 4483 4435 4434 +f 4484 4435 4483 +f 4484 4436 4435 +f 4485 4436 4484 +f 4485 4437 4436 +f 4486 4437 4485 +f 4486 4438 4437 +f 4486 4439 4438 +f 4487 4439 4486 +f 4488 4439 4487 +f 4488 4440 4439 +f 4489 4440 4488 +f 4489 4441 4440 +f 4490 4441 4489 +f 4490 4442 4441 +f 4491 4442 4490 +f 4491 4443 4442 +f 4492 4443 4491 +f 4492 4444 4443 +f 4493 4444 4492 +f 4493 4445 4444 +f 4494 4445 4493 +f 4494 4446 4445 +f 4495 4446 4494 +f 4495 4447 4446 +f 4496 4447 4495 +f 4496 4448 4447 +f 4497 4448 4496 +f 4497 4449 4448 +f 4498 4449 4497 +f 4498 4450 4449 +f 4499 4450 4498 +f 4499 4451 4450 +f 4500 4451 4499 +f 4500 4452 4451 +f 4501 4452 4500 +f 4501 4453 4452 +f 4502 4453 4501 +f 4502 4454 4453 +f 4456 4454 4502 +f 4456 4408 4454 +f 4503 4456 4504 +f 4503 4455 4456 +f 4505 4455 4503 +f 4505 4457 4455 +f 4506 4457 4505 +f 4506 4458 4457 +f 4507 4458 4506 +f 4507 4459 4458 +f 4508 4459 4507 +f 4508 4460 4459 +f 4509 4460 4508 +f 4509 4461 4460 +f 4510 4461 4509 +f 4510 4462 4461 +f 4511 4462 4510 +f 4511 4463 4462 +f 4512 4463 4511 +f 4512 4464 4463 +f 4513 4464 4512 +f 4513 4465 4464 +f 4514 4465 4513 +f 4514 4466 4465 +f 4515 4466 4514 +f 4515 4467 4466 +f 4516 4467 4515 +f 4516 4468 4467 +f 4517 4468 4516 +f 4517 4469 4468 +f 4518 4469 4517 +f 4518 4470 4469 +f 4519 4470 4518 +f 4519 4471 4470 +f 4520 4471 4519 +f 4520 4472 4471 +f 4521 4472 4520 +f 4521 4473 4472 +f 4522 4473 4521 +f 4522 4474 4473 +f 4523 4474 4522 +f 4523 4475 4474 +f 4524 4475 4523 +f 4524 4476 4475 +f 4525 4476 4524 +f 4525 4477 4476 +f 4526 4477 4525 +f 4526 4478 4477 +f 4527 4478 4526 +f 4527 4479 4478 +f 4528 4479 4527 +f 4528 4480 4479 +f 4529 4480 4528 +f 4529 4481 4480 +f 4530 4481 4529 +f 4530 4482 4481 +f 4531 4482 4530 +f 4531 4483 4482 +f 4532 4483 4531 +f 4532 4484 4483 +f 4533 4484 4532 +f 4533 4485 4484 +f 4534 4485 4533 +f 4534 4486 4485 +f 4535 4486 4534 +f 4535 4487 4486 +f 4536 4487 4535 +f 4536 4488 4487 +f 4537 4488 4536 +f 4537 4489 4488 +f 4538 4489 4537 +f 4538 4490 4489 +f 4539 4490 4538 +f 4539 4491 4490 +f 4540 4491 4539 +f 4540 4492 4491 +f 4541 4492 4540 +f 4541 4493 4492 +f 4542 4493 4541 +f 4542 4494 4493 +f 4543 4494 4542 +f 4543 4495 4494 +f 4544 4495 4543 +f 4544 4496 4495 +f 4545 4496 4544 +f 4545 4497 4496 +f 4546 4497 4545 +f 4546 4498 4497 +f 4547 4498 4546 +f 4547 4499 4498 +f 4548 4499 4547 +f 4548 4500 4499 +f 4549 4500 4548 +f 4549 4501 4500 +f 4550 4501 4549 +f 4550 4502 4501 +f 4504 4502 4550 +f 4504 4456 4502 +f 4551 4504 4552 +f 4551 4503 4504 +f 4553 4503 4551 +f 4553 4505 4503 +f 4554 4505 4553 +f 4554 4506 4505 +f 4555 4506 4554 +f 4555 4507 4506 +f 4556 4507 4555 +f 4556 4508 4507 +f 4557 4508 4556 +f 4557 4509 4508 +f 4558 4509 4557 +f 4558 4510 4509 +f 4559 4510 4558 +f 4559 4511 4510 +f 4560 4511 4559 +f 4560 4512 4511 +f 4561 4512 4560 +f 4561 4513 4512 +f 4562 4513 4561 +f 4562 4514 4513 +f 4563 4514 4562 +f 4563 4515 4514 +f 4564 4515 4563 +f 4564 4516 4515 +f 4565 4516 4564 +f 4565 4517 4516 +f 4566 4517 4565 +f 4566 4518 4517 +f 4567 4518 4566 +f 4567 4519 4518 +f 4568 4519 4567 +f 4568 4520 4519 +f 4569 4520 4568 +f 4569 4521 4520 +f 4570 4521 4569 +f 4570 4522 4521 +f 4571 4522 4570 +f 4571 4523 4522 +f 4572 4523 4571 +f 4572 4524 4523 +f 4573 4524 4572 +f 4573 4525 4524 +f 4574 4525 4573 +f 4574 4526 4525 +f 4575 4526 4574 +f 4575 4527 4526 +f 4576 4527 4575 +f 4576 4528 4527 +f 4577 4528 4576 +f 4577 4529 4528 +f 4578 4529 4577 +f 4578 4530 4529 +f 4579 4530 4578 +f 4579 4531 4530 +f 4580 4531 4579 +f 4580 4532 4531 +f 4581 4532 4580 +f 4581 4533 4532 +f 4582 4533 4581 +f 4582 4534 4533 +f 4583 4534 4582 +f 4583 4535 4534 +f 4584 4535 4583 +f 4584 4536 4535 +f 4585 4536 4584 +f 4585 4537 4536 +f 4586 4537 4585 +f 4586 4538 4537 +f 4587 4538 4586 +f 4587 4539 4538 +f 4588 4539 4587 +f 4588 4540 4539 +f 4589 4540 4588 +f 4589 4541 4540 +f 4590 4541 4589 +f 4590 4542 4541 +f 4591 4542 4590 +f 4591 4543 4542 +f 4592 4543 4591 +f 4592 4544 4543 +f 4593 4544 4592 +f 4593 4545 4544 +f 4594 4545 4593 +f 4594 4546 4545 +f 4595 4546 4594 +f 4595 4547 4546 +f 4596 4547 4595 +f 4596 4548 4547 +f 4597 4548 4596 +f 4597 4549 4548 +f 4598 4549 4597 +f 4598 4550 4549 +f 4552 4550 4598 +f 4552 4504 4550 +f 4599 4552 4600 +f 4599 4551 4552 +f 4601 4551 4599 +f 4601 4553 4551 +f 4602 4553 4601 +f 4602 4554 4553 +f 4603 4554 4602 +f 4603 4555 4554 +f 4604 4555 4603 +f 4604 4556 4555 +f 4605 4556 4604 +f 4605 4557 4556 +f 4606 4557 4605 +f 4606 4558 4557 +f 4607 4558 4606 +f 4607 4559 4558 +f 4608 4559 4607 +f 4608 4560 4559 +f 4609 4560 4608 +f 4609 4561 4560 +f 4610 4561 4609 +f 4610 4562 4561 +f 4611 4562 4610 +f 4611 4563 4562 +f 4612 4563 4611 +f 4612 4564 4563 +f 4613 4564 4612 +f 4613 4565 4564 +f 4614 4565 4613 +f 4614 4566 4565 +f 4615 4566 4614 +f 4615 4567 4566 +f 4616 4567 4615 +f 4616 4568 4567 +f 4617 4568 4616 +f 4617 4569 4568 +f 4618 4569 4617 +f 4618 4570 4569 +f 4619 4570 4618 +f 4619 4571 4570 +f 4620 4571 4619 +f 4620 4572 4571 +f 4621 4572 4620 +f 4621 4573 4572 +f 4622 4573 4621 +f 4622 4574 4573 +f 4623 4574 4622 +f 4623 4575 4574 +f 4624 4575 4623 +f 4624 4576 4575 +f 4625 4576 4624 +f 4625 4577 4576 +f 4626 4577 4625 +f 4626 4578 4577 +f 4627 4578 4626 +f 4627 4579 4578 +f 4628 4579 4627 +f 4628 4580 4579 +f 4629 4580 4628 +f 4629 4581 4580 +f 4630 4581 4629 +f 4630 4582 4581 +f 4631 4582 4630 +f 4631 4583 4582 +f 4632 4583 4631 +f 4632 4584 4583 +f 4633 4584 4632 +f 4633 4585 4584 +f 4634 4585 4633 +f 4634 4586 4585 +f 4635 4586 4634 +f 4635 4587 4586 +f 4636 4587 4635 +f 4636 4588 4587 +f 4637 4588 4636 +f 4637 4589 4588 +f 4638 4589 4637 +f 4638 4590 4589 +f 4639 4590 4638 +f 4639 4591 4590 +f 4640 4591 4639 +f 4640 4592 4591 +f 4641 4592 4640 +f 4641 4593 4592 +f 4642 4593 4641 +f 4642 4594 4593 +f 4643 4594 4642 +f 4643 4595 4594 +f 4644 4595 4643 +f 4644 4596 4595 +f 4645 4596 4644 +f 4645 4597 4596 +f 4646 4597 4645 +f 4646 4598 4597 +f 4600 4598 4646 +f 4600 4552 4598 +f 4647 4600 4648 +f 4647 4599 4600 +f 4649 4599 4647 +f 4649 4601 4599 +f 4650 4601 4649 +f 4650 4602 4601 +f 4651 4602 4650 +f 4651 4603 4602 +f 4652 4603 4651 +f 4652 4604 4603 +f 4653 4604 4652 +f 4653 4605 4604 +f 4654 4605 4653 +f 4654 4606 4605 +f 4655 4606 4654 +f 4655 4607 4606 +f 4656 4607 4655 +f 4656 4608 4607 +f 4657 4608 4656 +f 4657 4609 4608 +f 4658 4609 4657 +f 4658 4610 4609 +f 4659 4610 4658 +f 4659 4611 4610 +f 4660 4611 4659 +f 4660 4612 4611 +f 4661 4612 4660 +f 4661 4613 4612 +f 4662 4613 4661 +f 4662 4614 4613 +f 4663 4614 4662 +f 4663 4615 4614 +f 4664 4615 4663 +f 4664 4616 4615 +f 4665 4616 4664 +f 4665 4617 4616 +f 4666 4617 4665 +f 4666 4618 4617 +f 4667 4618 4666 +f 4667 4619 4618 +f 4668 4619 4667 +f 4668 4620 4619 +f 4669 4620 4668 +f 4669 4621 4620 +f 4670 4621 4669 +f 4670 4622 4621 +f 4671 4622 4670 +f 4671 4623 4622 +f 4672 4623 4671 +f 4672 4624 4623 +f 4673 4624 4672 +f 4673 4625 4624 +f 4674 4625 4673 +f 4674 4626 4625 +f 4675 4626 4674 +f 4675 4627 4626 +f 4676 4627 4675 +f 4676 4628 4627 +f 4676 4629 4628 +f 4677 4629 4676 +f 4678 4629 4677 +f 4678 4630 4629 +f 4679 4630 4678 +f 4679 4631 4630 +f 4680 4631 4679 +f 4680 4632 4631 +f 4680 4633 4632 +f 4681 4633 4680 +f 4682 4633 4681 +f 4682 4634 4633 +f 4683 4634 4682 +f 4683 4635 4634 +f 4684 4635 4683 +f 4684 4636 4635 +f 4685 4636 4684 +f 4685 4637 4636 +f 4686 4637 4685 +f 4686 4638 4637 +f 4687 4638 4686 +f 4687 4639 4638 +f 4688 4639 4687 +f 4688 4640 4639 +f 4689 4640 4688 +f 4689 4641 4640 +f 4690 4641 4689 +f 4690 4642 4641 +f 4691 4642 4690 +f 4691 4643 4642 +f 4692 4643 4691 +f 4692 4644 4643 +f 4693 4644 4692 +f 4693 4645 4644 +f 4694 4645 4693 +f 4694 4646 4645 +f 4648 4646 4694 +f 4648 4600 4646 +f 4695 4696 4697 +f 4698 4696 4695 +f 4698 4699 4696 +f 4700 4699 4698 +f 4700 4701 4699 +f 4700 4702 4701 +f 4703 4702 4700 +f 4703 4704 4702 +f 4705 4704 4703 +f 4706 4704 4705 +f 4706 4707 4704 +f 4706 4708 4707 +f 4709 4708 4706 +f 4710 4708 4709 +f 4710 4709 4711 +f 4710 4711 4712 +f 4710 4712 4708 +f 4713 4712 4711 +f 4713 4711 4714 +f 4713 4714 4715 +f 4713 4715 4712 +f 4716 4715 4714 +f 4716 4714 4717 +f 4716 4717 4718 +f 4716 4718 4715 +f 4719 4718 4717 +f 4719 4720 4718 +f 4721 4722 4723 +f 4721 4724 4722 +f 4725 4724 4721 +f 4725 4726 4724 +f 4725 4727 4726 +f 4728 4727 4725 +f 4729 4727 4728 +f 4729 4730 4727 +f 4731 4730 4729 +f 4731 4732 4730 +f 4733 4732 4731 +f 4733 4734 4732 +f 4735 4734 4733 +f 4735 4736 4734 +f 4737 4736 4735 +f 4737 4738 4736 +f 4739 4738 4737 +f 4739 4740 4738 +f 4741 4740 4739 +f 4741 4742 4740 +f 4743 4742 4741 +f 4743 4744 4742 +f 4745 4744 4743 +f 4745 4746 4744 +f 4747 4746 4745 +f 4747 4748 4746 +f 4749 4748 4747 +f 4749 4750 4748 +f 4751 4750 4749 +f 4751 4752 4750 +f 4753 4752 4751 +f 4753 4754 4752 +f 4755 4754 4753 +f 4755 4756 4754 +f 1729 4756 4755 +f 1729 4757 4756 +f 4758 4695 4759 +f 4758 4698 4695 +f 4760 4698 4758 +f 4760 4700 4698 +f 4761 4700 4760 +f 4761 4703 4700 +f 4762 4703 4761 +f 4762 4705 4703 +f 4763 4705 4762 +f 4763 4706 4705 +f 4764 4706 4763 +f 4764 4709 4706 +f 4765 4709 4764 +f 4765 4711 4709 +f 4766 4711 4765 +f 4766 4714 4711 +f 4767 4714 4766 +f 4767 4768 4714 +f 4769 4768 4767 +f 4769 4723 4768 +f 4770 4723 4769 +f 4770 4721 4723 +f 4770 4725 4721 +f 4771 4725 4770 +f 4772 4725 4771 +f 4772 4729 4725 +f 4773 4729 4772 +f 4773 4731 4729 +f 4774 4731 4773 +f 4774 4735 4731 +f 4775 4735 4774 +f 4775 4737 4735 +f 4775 4739 4737 +f 4776 4739 4775 +f 4777 4739 4776 +f 4777 4741 4739 +f 4777 4745 4741 +f 4778 4745 4777 +f 4779 4745 4778 +f 4779 4749 4745 +f 4779 4780 4749 +f 4781 4780 4779 +f 4782 4780 4781 +f 4782 4755 4780 +f 4782 1729 4755 +f 4783 4758 4759 +f 4784 4758 4783 +f 4785 4758 4784 +f 4785 4760 4758 +f 4786 4760 4785 +f 4786 4761 4760 +f 4787 4761 4786 +f 4787 4762 4761 +f 4787 4763 4762 +f 4788 4763 4787 +f 4789 4763 4788 +f 4789 4764 4763 +f 4789 4765 4764 +f 4790 4765 4789 +f 4791 4765 4790 +f 4791 4766 4765 +f 4792 4766 4791 +f 4792 4767 4766 +f 4793 4767 4792 +f 4793 4769 4767 +f 4794 4769 4793 +f 4794 4770 4769 +f 4795 4770 4794 +f 4795 4771 4770 +f 4796 4771 4795 +f 4796 4772 4771 +f 4797 4772 4796 +f 4797 4773 4772 +f 4797 4774 4773 +f 4798 4774 4797 +f 4799 4774 4798 +f 4799 4775 4774 +f 4800 4775 4799 +f 4800 4776 4775 +f 4800 4777 4776 +f 4801 4777 4800 +f 4802 4777 4801 +f 4802 4778 4777 +f 4803 4778 4802 +f 4803 4779 4778 +f 4804 4779 4803 +f 4804 4781 4779 +f 4805 4781 4804 +f 4805 4782 4781 +f 4806 4782 4805 +f 4807 4808 4809 +f 4810 4783 4807 +f 4810 4784 4783 +f 4811 4784 4810 +f 4811 4785 4784 +f 4812 4785 4811 +f 4812 4786 4785 +f 4813 4786 4812 +f 4813 4787 4786 +f 4814 4787 4813 +f 4814 4788 4787 +f 4814 4789 4788 +f 4815 4789 4814 +f 4816 4789 4815 +f 4816 4790 4789 +f 4817 4790 4816 +f 4817 4791 4790 +f 4818 4791 4817 +f 4818 4792 4791 +f 4819 4792 4818 +f 4819 4793 4792 +f 4820 4793 4819 +f 4820 4794 4793 +f 4821 4794 4820 +f 4821 4795 4794 +f 4822 4795 4821 +f 4822 4796 4795 +f 4823 4796 4822 +f 4823 4797 4796 +f 4824 4797 4823 +f 4824 4798 4797 +f 4824 4799 4798 +f 4825 4799 4824 +f 4825 4800 4799 +f 4826 4800 4825 +f 4827 4800 4826 +f 4827 4801 4800 +f 4827 4802 4801 +f 4828 4802 4827 +f 4829 4802 4828 +f 4829 4803 4802 +f 4830 4803 4829 +f 4830 4804 4803 +f 4831 4804 4830 +f 4831 4805 4804 +f 2063 4805 4831 +f 2063 4806 4805 +f 4832 4807 4809 +f 4833 4807 4832 +f 4834 4807 4833 +f 4834 4810 4807 +f 4835 4810 4834 +f 4835 4811 4810 +f 4835 4812 4811 +f 4836 4812 4835 +f 4837 4812 4836 +f 4837 4813 4812 +f 4838 4813 4837 +f 4838 4814 4813 +f 4839 4814 4838 +f 4839 4815 4814 +f 4839 4816 4815 +f 4840 4816 4839 +f 4841 4816 4840 +f 4841 4817 4816 +f 4841 4818 4817 +f 4842 4818 4841 +f 4843 4818 4842 +f 4843 4819 4818 +f 4844 4819 4843 +f 4844 4820 4819 +f 4845 4820 4844 +f 4845 4821 4820 +f 4845 4822 4821 +f 4846 4822 4845 +f 4847 4822 4846 +f 4847 4823 4822 +f 4848 4823 4847 +f 4848 4824 4823 +f 4848 4825 4824 +f 4849 4825 4848 +f 4850 4825 4849 +f 4850 4826 4825 +f 4851 4826 4850 +f 4851 4827 4826 +f 4852 4827 4851 +f 4852 4828 4827 +f 4853 4828 4852 +f 4853 4829 4828 +f 4854 4829 4853 +f 4854 4830 4829 +f 4855 4830 4854 +f 4855 4831 4830 +f 4856 4831 4855 +f 4856 2063 4831 +f 4857 4833 4832 +f 4858 4833 4857 +f 4859 4833 4858 +f 4859 4834 4833 +f 4859 4835 4834 +f 4860 4835 4859 +f 4861 4835 4860 +f 4861 4836 4835 +f 4861 4837 4836 +f 4862 4837 4861 +f 4863 4837 4862 +f 4863 4838 4837 +f 4864 4838 4863 +f 4864 4839 4838 +f 4865 4839 4864 +f 4865 4840 4839 +f 4866 4840 4865 +f 4866 4841 4840 +f 4867 4841 4866 +f 4867 4842 4841 +f 4868 4842 4867 +f 4868 4843 4842 +f 4869 4843 4868 +f 4869 4845 4843 +f 4869 4846 4845 +f 4870 4846 4869 +f 4871 4846 4870 +f 4871 4847 4846 +f 4872 4847 4871 +f 4872 4848 4847 +f 4873 4848 4872 +f 4873 4849 4848 +f 4874 4849 4873 +f 4874 4850 4849 +f 4875 4850 4874 +f 4875 4851 4850 +f 4876 4851 4875 +f 4876 4852 4851 +f 4876 4853 4852 +f 4877 4853 4876 +f 4877 4854 4853 +f 4878 4854 4877 +f 4879 4854 4878 +f 4879 4855 4854 +f 4880 4855 4879 +f 4880 4856 4855 +f 4881 4857 4882 +f 4881 4858 4857 +f 4881 4859 4858 +f 4883 4859 4881 +f 4884 4859 4883 +f 4884 4860 4859 +f 4885 4860 4884 +f 4885 4861 4860 +f 4886 4861 4885 +f 4886 4862 4861 +f 4886 4863 4862 +f 4887 4863 4886 +f 4887 4864 4863 +f 4888 4864 4887 +f 4889 4864 4888 +f 4889 4865 4864 +f 4890 4865 4889 +f 4890 4866 4865 +f 4891 4866 4890 +f 4891 4867 4866 +f 4891 4868 4867 +f 4892 4868 4891 +f 4893 4868 4892 +f 4893 4869 4868 +f 4893 4870 4869 +f 4894 4870 4893 +f 4895 4870 4894 +f 4895 4871 4870 +f 4896 4871 4895 +f 4896 4872 4871 +f 4897 4872 4896 +f 4897 4873 4872 +f 4898 4873 4897 +f 4898 4874 4873 +f 4899 4874 4898 +f 4899 4875 4874 +f 4900 4875 4899 +f 4900 4876 4875 +f 4901 4876 4900 +f 4901 4877 4876 +f 4902 4877 4901 +f 4902 4878 4877 +f 4903 4878 4902 +f 4903 4879 4878 +f 4903 4880 4879 +f 2446 4880 4903 +f 4904 4882 4905 +f 4904 4881 4882 +f 4906 4881 4904 +f 4906 4883 4881 +f 4907 4883 4906 +f 4907 4884 4883 +f 4908 4884 4907 +f 4908 4885 4884 +f 4909 4885 4908 +f 4909 4886 4885 +f 4910 4886 4909 +f 4910 4887 4886 +f 4911 4887 4910 +f 4911 4888 4887 +f 4911 4889 4888 +f 4912 4889 4911 +f 4913 4889 4912 +f 4913 4890 4889 +f 4914 4890 4913 +f 4914 4891 4890 +f 4914 4892 4891 +f 4915 4892 4914 +f 4915 4893 4892 +f 4916 4893 4915 +f 4917 4893 4916 +f 4917 4894 4893 +f 4918 4894 4917 +f 4918 4895 4894 +f 4919 4895 4918 +f 4919 4896 4895 +f 4920 4896 4919 +f 4920 4897 4896 +f 4921 4897 4920 +f 4921 4898 4897 +f 4922 4898 4921 +f 4922 4899 4898 +f 4923 4899 4922 +f 4923 4900 4899 +f 4924 4900 4923 +f 4924 4901 4900 +f 4925 4901 4924 +f 4925 4902 4901 +f 4926 4902 4925 +f 4926 4903 4902 +f 4927 4903 4926 +f 4927 2446 4903 +f 4928 4905 4929 +f 4930 4905 4928 +f 4930 4931 4905 +f 4932 4931 4930 +f 4932 4933 4931 +f 4934 4933 4932 +f 4934 4907 4933 +f 4935 4907 4934 +f 4935 4908 4907 +f 4936 4908 4935 +f 4936 4909 4908 +f 4937 4909 4936 +f 4937 4910 4909 +f 4938 4910 4937 +f 4938 4911 4910 +f 4939 4911 4938 +f 4939 4912 4911 +f 4940 4912 4939 +f 4940 4913 4912 +f 4941 4913 4940 +f 4941 4914 4913 +f 4942 4914 4941 +f 4942 4915 4914 +f 4943 4915 4942 +f 4943 4916 4915 +f 4944 4916 4943 +f 4944 4917 4916 +f 4945 4917 4944 +f 4945 4918 4917 +f 4946 4918 4945 +f 4946 4919 4918 +f 4947 4919 4946 +f 4947 4920 4919 +f 4948 4920 4947 +f 4948 4921 4920 +f 4949 4921 4948 +f 4949 4922 4921 +f 4950 4922 4949 +f 4950 4923 4922 +f 4951 4923 4950 +f 4951 4924 4923 +f 4952 4924 4951 +f 4952 4925 4924 +f 4953 4925 4952 +f 4953 4926 4925 +f 4954 4926 4953 +f 4954 4927 4926 +f 4955 4929 4956 +f 4955 4928 4929 +f 4957 4928 4955 +f 4957 4930 4928 +f 4958 4930 4957 +f 4958 4932 4930 +f 4959 4932 4958 +f 4959 4934 4932 +f 4960 4934 4959 +f 4960 4935 4934 +f 4961 4935 4960 +f 4961 4936 4935 +f 4962 4936 4961 +f 4962 4937 4936 +f 4963 4937 4962 +f 4963 4938 4937 +f 4964 4938 4963 +f 4964 4939 4938 +f 4965 4939 4964 +f 4965 4940 4939 +f 4966 4940 4965 +f 4966 4941 4940 +f 4967 4941 4966 +f 4967 4942 4941 +f 4968 4942 4967 +f 4968 4943 4942 +f 4969 4943 4968 +f 4969 4944 4943 +f 4970 4944 4969 +f 4970 4945 4944 +f 4971 4945 4970 +f 4971 4946 4945 +f 4972 4946 4971 +f 4972 4947 4946 +f 4973 4947 4972 +f 4973 4948 4947 +f 4974 4948 4973 +f 4974 4949 4948 +f 4975 4949 4974 +f 4975 4950 4949 +f 4976 4950 4975 +f 4976 4951 4950 +f 4977 4951 4976 +f 4977 4952 4951 +f 4978 4952 4977 +f 4978 4953 4952 +f 2829 4953 4978 +f 2829 4954 4953 +f 4979 4956 4980 +f 4979 4955 4956 +f 4981 4955 4979 +f 4981 4957 4955 +f 4982 4957 4981 +f 4982 4958 4957 +f 4983 4958 4982 +f 4983 4959 4958 +f 4984 4959 4983 +f 4984 4960 4959 +f 4985 4960 4984 +f 4985 4961 4960 +f 4986 4961 4985 +f 4986 4962 4961 +f 4987 4962 4986 +f 4987 4963 4962 +f 4988 4963 4987 +f 4988 4964 4963 +f 4989 4964 4988 +f 4989 4965 4964 +f 4990 4965 4989 +f 4990 4966 4965 +f 4991 4966 4990 +f 4991 4967 4966 +f 4992 4967 4991 +f 4992 4968 4967 +f 4993 4968 4992 +f 4993 4969 4968 +f 4994 4969 4993 +f 4994 4970 4969 +f 4995 4970 4994 +f 4995 4971 4970 +f 4996 4971 4995 +f 4996 4972 4971 +f 4997 4972 4996 +f 4997 4973 4972 +f 4998 4973 4997 +f 4998 4974 4973 +f 4999 4974 4998 +f 4999 4975 4974 +f 5000 4975 4999 +f 5000 4976 4975 +f 5001 4976 5000 +f 5001 4977 4976 +f 5002 4977 5001 +f 5002 4978 4977 +f 5003 4978 5002 +f 5003 2829 4978 +f 5004 4980 5005 +f 5004 4979 4980 +f 5006 4979 5004 +f 5006 4981 4979 +f 5007 4981 5006 +f 5007 4982 4981 +f 5008 4982 5007 +f 5008 4983 4982 +f 5009 4983 5008 +f 5009 4984 4983 +f 5010 4984 5009 +f 5010 4985 4984 +f 5011 4985 5010 +f 5011 4986 4985 +f 5012 4986 5011 +f 5012 4987 4986 +f 5013 4987 5012 +f 5013 4988 4987 +f 5014 4988 5013 +f 5014 4989 4988 +f 5015 4989 5014 +f 5015 4990 4989 +f 5016 4990 5015 +f 5016 4991 4990 +f 5017 4991 5016 +f 5017 4992 4991 +f 5018 4992 5017 +f 5018 4993 4992 +f 5019 4993 5018 +f 5019 4994 4993 +f 5020 4994 5019 +f 5020 4995 4994 +f 5021 4995 5020 +f 5021 4996 4995 +f 5022 4996 5021 +f 5022 4997 4996 +f 5023 4997 5022 +f 5023 4998 4997 +f 5024 4998 5023 +f 5024 4999 4998 +f 5025 4999 5024 +f 5025 5000 4999 +f 5026 5000 5025 +f 5026 5001 5000 +f 5027 5001 5026 +f 5027 5002 5001 +f 5028 5002 5027 +f 5028 5003 5002 +f 5029 5005 5030 +f 5029 5004 5005 +f 5031 5004 5029 +f 5031 5006 5004 +f 5032 5006 5031 +f 5032 5007 5006 +f 5033 5007 5032 +f 5033 5008 5007 +f 5034 5008 5033 +f 5034 5009 5008 +f 5035 5009 5034 +f 5035 5010 5009 +f 5036 5010 5035 +f 5036 5011 5010 +f 5037 5011 5036 +f 5037 5012 5011 +f 5038 5012 5037 +f 5038 5013 5012 +f 5039 5013 5038 +f 5039 5014 5013 +f 5040 5014 5039 +f 5040 5015 5014 +f 5041 5015 5040 +f 5041 5016 5015 +f 5042 5016 5041 +f 5042 5017 5016 +f 5043 5017 5042 +f 5043 5018 5017 +f 5044 5018 5043 +f 5044 5019 5018 +f 5045 5019 5044 +f 5045 5020 5019 +f 5046 5020 5045 +f 5046 5021 5020 +f 5047 5021 5046 +f 5047 5022 5021 +f 5048 5022 5047 +f 5048 5023 5022 +f 5049 5023 5048 +f 5049 5024 5023 +f 5050 5024 5049 +f 5050 5025 5024 +f 5051 5025 5050 +f 5051 5026 5025 +f 5052 5026 5051 +f 5052 5027 5026 +f 3212 5027 5052 +f 3212 5028 5027 +f 5053 5030 5054 +f 5053 5029 5030 +f 5055 5029 5053 +f 5055 5031 5029 +f 5056 5031 5055 +f 5056 5032 5031 +f 5057 5032 5056 +f 5057 5033 5032 +f 5058 5033 5057 +f 5058 5034 5033 +f 5059 5034 5058 +f 5059 5035 5034 +f 5060 5035 5059 +f 5060 5036 5035 +f 5061 5036 5060 +f 5061 5037 5036 +f 5062 5037 5061 +f 5062 5038 5037 +f 5063 5038 5062 +f 5063 5039 5038 +f 5064 5039 5063 +f 5064 5040 5039 +f 5065 5040 5064 +f 5065 5041 5040 +f 5066 5041 5065 +f 5066 5042 5041 +f 5067 5042 5066 +f 5067 5043 5042 +f 5068 5043 5067 +f 5068 5044 5043 +f 5069 5044 5068 +f 5069 5045 5044 +f 5070 5045 5069 +f 5070 5046 5045 +f 5071 5046 5070 +f 5071 5047 5046 +f 5072 5047 5071 +f 5072 5048 5047 +f 5073 5048 5072 +f 5073 5049 5048 +f 5074 5049 5073 +f 5074 5050 5049 +f 5075 5050 5074 +f 5075 5051 5050 +f 5076 5051 5075 +f 5076 5052 5051 +f 5077 5052 5076 +f 5077 3212 5052 +f 5078 5053 5054 +f 5079 5053 5078 +f 5079 5055 5053 +f 5080 5055 5079 +f 5080 5056 5055 +f 5081 5056 5080 +f 5081 5057 5056 +f 5082 5057 5081 +f 5082 5058 5057 +f 5083 5058 5082 +f 5083 5059 5058 +f 5084 5059 5083 +f 5084 5060 5059 +f 5085 5060 5084 +f 5085 5061 5060 +f 5085 5062 5061 +f 5086 5062 5085 +f 5087 5062 5086 +f 5087 5063 5062 +f 5088 5063 5087 +f 5088 5064 5063 +f 5089 5064 5088 +f 5089 5065 5064 +f 5090 5065 5089 +f 5090 5066 5065 +f 5091 5066 5090 +f 5091 5067 5066 +f 5092 5067 5091 +f 5092 5068 5067 +f 5093 5068 5092 +f 5093 5069 5068 +f 5094 5069 5093 +f 5094 5070 5069 +f 5095 5070 5094 +f 5095 5071 5070 +f 5096 5071 5095 +f 5096 5072 5071 +f 5097 5072 5096 +f 5097 5073 5072 +f 5098 5073 5097 +f 5098 5074 5073 +f 5098 5075 5074 +f 5099 5075 5098 +f 5100 5075 5099 +f 5100 5076 5075 +f 5101 5076 5100 +f 5101 5077 5076 +f 5102 5078 5103 +f 5102 5104 5078 +f 5105 5104 5102 +f 5105 5106 5104 +f 5107 5106 5105 +f 5107 5081 5106 +f 5108 5081 5107 +f 5108 5082 5081 +f 5109 5082 5108 +f 5109 5083 5082 +f 5110 5083 5109 +f 5110 5084 5083 +f 5110 5085 5084 +f 5111 5085 5110 +f 5112 5085 5111 +f 5112 5086 5085 +f 5113 5086 5112 +f 5113 5087 5086 +f 5113 5088 5087 +f 5114 5088 5113 +f 5115 5088 5114 +f 5115 5089 5088 +f 5116 5089 5115 +f 5116 5090 5089 +f 5117 5090 5116 +f 5117 5091 5090 +f 5118 5091 5117 +f 5118 5092 5091 +f 5119 5092 5118 +f 5119 5093 5092 +f 5120 5093 5119 +f 5120 5094 5093 +f 5121 5094 5120 +f 5121 5095 5094 +f 5122 5095 5121 +f 5122 5096 5095 +f 5123 5096 5122 +f 5123 5097 5096 +f 5124 5097 5123 +f 5124 5098 5097 +f 5125 5098 5124 +f 5125 5099 5098 +f 5126 5099 5125 +f 5126 5100 5099 +f 3595 5100 5126 +f 3595 5101 5100 +f 5127 5103 5128 +f 5127 5102 5103 +f 5129 5102 5127 +f 5129 5105 5102 +f 5130 5105 5129 +f 5130 5107 5105 +f 5131 5107 5130 +f 5131 5108 5107 +f 5132 5108 5131 +f 5132 5109 5108 +f 5133 5109 5132 +f 5133 5110 5109 +f 5134 5110 5133 +f 5134 5111 5110 +f 5134 5112 5111 +f 5135 5112 5134 +f 5136 5112 5135 +f 5136 5113 5112 +f 5137 5113 5136 +f 5137 5114 5113 +f 5138 5114 5137 +f 5138 5115 5114 +f 5138 5116 5115 +f 5139 5116 5138 +f 5140 5116 5139 +f 5140 5117 5116 +f 5141 5117 5140 +f 5141 5118 5117 +f 5142 5118 5141 +f 5142 5119 5118 +f 5143 5119 5142 +f 5143 5120 5119 +f 5144 5120 5143 +f 5144 5121 5120 +f 5144 5122 5121 +f 5145 5122 5144 +f 5146 5122 5145 +f 5146 5123 5122 +f 5147 5123 5146 +f 5147 5124 5123 +f 5148 5124 5147 +f 5148 5125 5124 +f 5149 5125 5148 +f 5149 5126 5125 +f 5150 5126 5149 +f 5150 3595 5126 +f 5151 5128 5152 +f 5151 5127 5128 +f 5151 5129 5127 +f 5153 5129 5151 +f 5154 5129 5153 +f 5154 5130 5129 +f 5155 5130 5154 +f 5155 5131 5130 +f 5156 5131 5155 +f 5156 5132 5131 +f 5157 5132 5156 +f 5157 5133 5132 +f 5158 5133 5157 +f 5158 5134 5133 +f 5159 5134 5158 +f 5159 5135 5134 +f 5159 5136 5135 +f 5160 5136 5159 +f 5161 5136 5160 +f 5161 5137 5136 +f 5162 5137 5161 +f 5162 5138 5137 +f 5162 5139 5138 +f 5163 5139 5162 +f 5164 5139 5163 +f 5164 5140 5139 +f 5164 5141 5140 +f 5165 5141 5164 +f 5166 5141 5165 +f 5166 5142 5141 +f 5167 5142 5166 +f 5167 5143 5142 +f 5167 5144 5143 +f 5168 5144 5167 +f 5169 5144 5168 +f 5169 5145 5144 +f 5170 5145 5169 +f 5170 5146 5145 +f 5171 5146 5170 +f 5171 5147 5146 +f 5171 5148 5147 +f 5172 5148 5171 +f 5173 5148 5172 +f 5173 5149 5148 +f 5174 5149 5173 +f 5174 5150 5149 +f 5175 5152 5176 +f 5175 5151 5152 +f 5175 5153 5151 +f 5177 5153 5175 +f 5178 5153 5177 +f 5178 5154 5153 +f 5179 5154 5178 +f 5179 5155 5154 +f 5179 5156 5155 +f 5180 5156 5179 +f 5180 5157 5156 +f 5181 5157 5180 +f 5182 5157 5181 +f 5182 5158 5157 +f 5183 5158 5182 +f 5183 5159 5158 +f 5183 5160 5159 +f 5184 5160 5183 +f 5185 5160 5184 +f 5185 5161 5160 +f 5185 5162 5161 +f 5186 5162 5185 +f 5187 5162 5186 +f 5187 5163 5162 +f 5188 5163 5187 +f 5188 5164 5163 +f 5189 5164 5188 +f 5189 5165 5164 +f 5189 5166 5165 +f 5190 5166 5189 +f 5191 5166 5190 +f 5191 5167 5166 +f 5192 5167 5191 +f 5192 5168 5167 +f 5193 5168 5192 +f 5193 5169 5168 +f 5193 5170 5169 +f 5194 5170 5193 +f 5195 5170 5194 +f 5195 5171 5170 +f 5196 5171 5195 +f 5196 5172 5171 +f 5197 5172 5196 +f 5197 5173 5172 +f 3929 5173 5197 +f 3929 5174 5173 +f 5198 5175 5176 +f 5199 5175 5200 +f 5199 5177 5175 +f 5201 5177 5199 +f 5201 5178 5177 +f 5201 5179 5178 +f 5202 5179 5201 +f 5203 5179 5202 +f 5203 5180 5179 +f 5204 5180 5203 +f 5204 5181 5180 +f 5205 5181 5204 +f 5205 5182 5181 +f 5206 5182 5205 +f 5206 5183 5182 +f 5206 5184 5183 +f 5207 5184 5206 +f 5208 5184 5207 +f 5208 5185 5184 +f 5209 5185 5208 +f 5209 5186 5185 +f 5210 5186 5209 +f 5210 5211 5186 +f 5210 5187 5211 +f 5212 5187 5210 +f 5213 5187 5212 +f 5213 5188 5187 +f 5214 5188 5213 +f 5214 5189 5188 +f 5215 5189 5214 +f 5215 5190 5189 +f 5216 5190 5215 +f 5216 5191 5190 +f 5217 5191 5216 +f 5217 5192 5191 +f 5218 5192 5217 +f 5218 5193 5192 +f 5219 5193 5218 +f 5219 5194 5193 +f 5220 5194 5219 +f 5220 5195 5194 +f 5220 5196 5195 +f 5221 5196 5220 +f 5222 5196 5221 +f 5222 5197 5196 +f 5223 5197 5222 +f 5223 3929 5197 +f 5224 5200 5225 +f 5224 5199 5200 +f 5226 5199 5224 +f 5226 5201 5199 +f 5227 5201 5226 +f 5227 5202 5201 +f 5228 5202 5227 +f 5228 5203 5202 +f 5229 5203 5228 +f 5229 5204 5203 +f 5229 5205 5204 +f 5230 5205 5229 +f 5231 5205 5230 +f 5231 5206 5205 +f 5232 5206 5231 +f 5232 5207 5206 +f 5233 5207 5232 +f 5233 5208 5207 +f 5234 5208 5233 +f 5234 5209 5208 +f 5234 5210 5209 +f 5235 5210 5234 +f 5235 5212 5210 +f 5236 5212 5235 +f 5237 5212 5236 +f 5237 5213 5212 +f 5238 5213 5237 +f 5238 5214 5213 +f 5239 5214 5238 +f 5239 5215 5214 +f 5240 5215 5239 +f 5240 5216 5215 +f 5241 5216 5240 +f 5241 5217 5216 +f 5242 5217 5241 +f 5242 5218 5217 +f 5243 5218 5242 +f 5243 5219 5218 +f 5244 5219 5243 +f 5244 5220 5219 +f 5245 5220 5244 +f 5245 5221 5220 +f 5246 5221 5245 +f 5246 5222 5221 +f 5246 5223 5222 +f 5247 5224 5225 +f 5248 5224 5247 +f 5249 5224 5248 +f 5249 5226 5224 +f 5250 5226 5249 +f 5250 5227 5226 +f 5251 5227 5250 +f 5251 5228 5227 +f 5252 5228 5251 +f 5252 5229 5228 +f 5253 5229 5252 +f 5253 5230 5229 +f 5254 5230 5253 +f 5254 5231 5230 +f 5255 5231 5254 +f 5255 5232 5231 +f 5255 5233 5232 +f 5256 5233 5255 +f 5257 5233 5256 +f 5257 5234 5233 +f 5258 5234 5257 +f 5258 5235 5234 +f 5259 5235 5258 +f 5259 5236 5235 +f 5259 5237 5236 +f 5260 5237 5259 +f 5261 5237 5260 +f 5261 5238 5237 +f 5262 5238 5261 +f 5262 5239 5238 +f 5263 5239 5262 +f 5263 5240 5239 +f 5264 5240 5263 +f 5264 5241 5240 +f 5264 5242 5241 +f 5265 5242 5264 +f 5266 5242 5265 +f 5266 5243 5242 +f 5267 5243 5266 +f 5267 5244 5243 +f 5268 5244 5267 +f 5268 5245 5244 +f 5269 5245 5268 +f 5269 5246 5245 +f 4264 5246 5269 +f 5270 5247 5271 +f 5270 5248 5247 +f 5272 5248 5270 +f 5273 5248 5272 +f 5273 5249 5248 +f 5274 5249 5273 +f 5274 5250 5249 +f 5275 5250 5274 +f 5275 5251 5250 +f 5275 5252 5251 +f 5276 5252 5275 +f 5277 5252 5276 +f 5277 5253 5252 +f 5278 5253 5277 +f 5278 5277 5279 +f 5278 5279 5254 +f 5278 5254 5253 +f 5280 5254 5279 +f 5280 5279 5281 +f 5280 5281 5255 +f 5280 5255 5254 +f 5282 5255 5281 +f 5282 5256 5255 +f 5283 5256 5282 +f 5283 5257 5256 +f 5284 5257 5283 +f 5284 5258 5257 +f 5285 5258 5284 +f 5285 5259 5258 +f 5286 5259 5285 +f 5286 5260 5259 +f 5287 5260 5286 +f 5287 5261 5260 +f 5288 5261 5287 +f 5288 5262 5261 +f 5289 5262 5288 +f 5289 5263 5262 +f 5290 5263 5289 +f 5290 5264 5263 +f 5290 5265 5264 +f 5291 5265 5290 +f 5292 5265 5291 +f 5292 5266 5265 +f 5293 5266 5292 +f 5293 5267 5266 +f 5293 5268 5267 +f 5294 5268 5293 +f 5295 5268 5294 +f 5295 5269 5268 +f 5295 4264 5269 +f 5296 4264 5295 +f 5297 5298 5299 +f 5300 5299 5301 +f 5300 5297 5299 +f 5302 5301 5303 +f 5302 5300 5301 +f 5304 5303 5305 +f 5304 5302 5303 +f 5306 5305 5307 +f 5306 5304 5305 +f 5308 5306 5307 +f 5309 5298 5297 +f 5310 5297 5300 +f 5310 5309 5297 +f 5310 5300 5302 +f 5311 5310 5302 +f 5312 5302 5304 +f 5312 5311 5302 +f 5313 5304 5306 +f 5313 5312 5304 +f 5308 5313 5306 +f 5314 5298 5309 +f 5315 5309 5310 +f 5315 5314 5309 +f 5316 5310 5311 +f 5316 5315 5310 +f 5317 5311 5312 +f 5317 5316 5311 +f 5318 5312 5313 +f 5318 5317 5312 +f 5308 5318 5313 +f 5319 5298 5314 +f 5315 5319 5314 +f 5320 5319 5315 +f 5321 5315 5316 +f 5321 5320 5315 +f 5321 5316 5317 +f 5322 5321 5317 +f 5323 5317 5318 +f 5323 5322 5317 +f 5308 5323 5318 +f 5324 5298 5319 +f 5325 5319 5320 +f 5325 5324 5319 +f 5326 5320 5321 +f 5326 5325 5320 +f 5327 5321 5322 +f 5327 5326 5321 +f 5328 5322 5323 +f 5328 5327 5322 +f 5308 5328 5323 +f 5329 5298 5324 +f 5330 5324 5325 +f 5330 5329 5324 +f 5330 5325 5326 +f 5331 5330 5326 +f 5332 5326 5327 +f 5332 5331 5326 +f 5333 5327 5328 +f 5333 5332 5327 +f 5308 5333 5328 +f 5334 5298 5329 +f 5330 5334 5329 +f 5335 5334 5330 +f 5336 5330 5331 +f 5336 5335 5330 +f 5337 5331 5332 +f 5337 5336 5331 +f 5338 5332 5333 +f 5338 5337 5332 +f 5308 5338 5333 +f 5339 5298 5334 +f 5335 5339 5334 +f 5340 5339 5335 +f 5340 5335 5336 +f 5341 5340 5336 +f 5342 5336 5337 +f 5342 5341 5336 +f 5343 5337 5338 +f 5343 5342 5337 +f 5308 5343 5338 +f 5344 5298 5339 +f 5345 5339 5340 +f 5345 5344 5339 +f 5346 5340 5341 +f 5346 5345 5340 +f 5347 5341 5342 +f 5347 5346 5341 +f 5348 5342 5343 +f 5348 5347 5342 +f 5308 5348 5343 +f 5299 5298 5344 +f 5345 5299 5344 +f 5301 5299 5345 +f 5303 5345 5346 +f 5303 5301 5345 +f 5305 5346 5347 +f 5305 5303 5346 +f 5307 5347 5348 +f 5307 5305 5347 +f 5308 5307 5348 +f 5349 5350 5351 +f 5352 5351 5353 +f 5352 5349 5351 +f 5354 5353 5355 +f 5354 5352 5353 +f 5356 5355 5357 +f 5356 5354 5355 +f 5358 5357 5359 +f 5358 5356 5357 +f 5298 5358 5359 +f 5360 5350 5349 +f 5352 5360 5349 +f 5361 5360 5352 +f 5362 5352 5354 +f 5362 5361 5352 +f 5363 5354 5356 +f 5363 5362 5354 +f 5358 5363 5356 +f 5364 5363 5358 +f 5298 5364 5358 +f 5365 5350 5360 +f 5366 5360 5361 +f 5366 5365 5360 +f 5367 5361 5362 +f 5367 5366 5361 +f 5368 5362 5363 +f 5368 5367 5362 +f 5364 5368 5363 +f 5369 5368 5364 +f 5298 5369 5364 +f 5370 5350 5365 +f 5371 5365 5366 +f 5371 5370 5365 +f 5372 5366 5367 +f 5372 5371 5366 +f 5373 5367 5368 +f 5373 5372 5367 +f 5374 5368 5369 +f 5374 5373 5368 +f 5298 5374 5369 +f 5375 5350 5370 +f 5376 5370 5371 +f 5376 5375 5370 +f 5377 5371 5372 +f 5377 5376 5371 +f 5378 5372 5373 +f 5378 5377 5372 +f 5379 5373 5374 +f 5379 5378 5373 +f 5298 5379 5374 +f 5380 5350 5375 +f 5381 5375 5376 +f 5381 5380 5375 +f 5382 5376 5377 +f 5382 5381 5376 +f 5382 5377 5378 +f 5383 5382 5378 +f 5384 5378 5379 +f 5384 5383 5378 +f 5298 5384 5379 +f 5385 5350 5380 +f 5381 5385 5380 +f 5386 5385 5381 +f 5386 5381 5382 +f 5387 5386 5382 +f 5388 5382 5383 +f 5388 5387 5382 +f 5389 5383 5384 +f 5389 5388 5383 +f 5298 5389 5384 +f 5390 5350 5385 +f 5391 5385 5386 +f 5391 5390 5385 +f 5392 5386 5387 +f 5392 5391 5386 +f 5393 5387 5388 +f 5393 5392 5387 +f 5394 5388 5389 +f 5394 5393 5388 +f 5298 5394 5389 +f 5395 5350 5390 +f 5396 5390 5391 +f 5396 5395 5390 +f 5397 5391 5392 +f 5397 5396 5391 +f 5397 5392 5393 +f 5398 5397 5393 +f 5399 5393 5394 +f 5399 5398 5393 +f 5298 5399 5394 +f 5351 5350 5395 +f 5353 5395 5396 +f 5353 5351 5395 +f 5355 5396 5397 +f 5355 5353 5396 +f 5357 5397 5398 +f 5357 5355 5397 +f 5359 5398 5399 +f 5359 5357 5398 +f 5298 5359 5399 +f 5397 5303 5355 +f 5397 5346 5303 +f 5392 5346 5397 +f 5392 5341 5346 +f 5387 5341 5392 +f 5387 5336 5341 +f 5382 5336 5387 +f 5382 5331 5336 +f 5382 5326 5331 +f 5377 5326 5382 +f 5377 5321 5326 +f 5372 5321 5377 +f 5367 5321 5372 +f 5367 5316 5321 +f 5367 5311 5316 +f 5362 5311 5367 +f 5362 5302 5311 +f 5354 5302 5362 +f 5355 5302 5354 +f 5355 5303 5302 +f 5400 5401 5402 +f 5403 5400 5402 +f 5404 5400 5403 +f 5405 5403 5406 +f 5405 5404 5403 +f 5407 5406 5408 +f 5407 5405 5406 +f 5409 5408 5410 +f 5409 5407 5408 +f 5411 5409 5410 +f 5412 5401 5400 +f 5413 5400 5404 +f 5413 5412 5400 +f 5413 5404 5405 +f 5414 5413 5405 +f 5415 5405 5407 +f 5415 5414 5405 +f 5416 5407 5409 +f 5416 5415 5407 +f 5411 5416 5409 +f 5417 5401 5412 +f 5418 5412 5413 +f 5418 5417 5412 +f 5419 5413 5414 +f 5419 5418 5413 +f 5420 5414 5415 +f 5420 5419 5414 +f 5421 5415 5416 +f 5421 5420 5415 +f 5411 5421 5416 +f 5422 5401 5417 +f 5423 5417 5418 +f 5423 5422 5417 +f 5424 5418 5419 +f 5424 5423 5418 +f 5424 5419 5420 +f 5425 5424 5420 +f 5426 5420 5421 +f 5426 5425 5420 +f 5411 5426 5421 +f 5427 5401 5422 +f 5428 5422 5423 +f 5428 5427 5422 +f 5429 5423 5424 +f 5429 5428 5423 +f 5430 5424 5425 +f 5430 5429 5424 +f 5431 5425 5426 +f 5431 5430 5425 +f 5411 5431 5426 +f 5432 5401 5427 +f 5433 5427 5428 +f 5433 5432 5427 +f 5433 5428 5429 +f 5434 5433 5429 +f 5435 5429 5430 +f 5435 5434 5429 +f 5436 5430 5431 +f 5436 5435 5430 +f 5411 5436 5431 +f 5437 5401 5432 +f 5433 5437 5432 +f 5438 5437 5433 +f 5439 5433 5434 +f 5439 5438 5433 +f 5440 5434 5435 +f 5440 5439 5434 +f 5441 5435 5436 +f 5441 5440 5435 +f 5411 5441 5436 +f 5442 5401 5437 +f 5443 5437 5438 +f 5443 5442 5437 +f 5444 5438 5439 +f 5444 5443 5438 +f 5445 5439 5440 +f 5445 5444 5439 +f 5446 5440 5441 +f 5446 5445 5440 +f 5411 5446 5441 +f 5447 5401 5442 +f 5448 5442 5443 +f 5448 5447 5442 +f 5449 5443 5444 +f 5449 5448 5443 +f 5450 5444 5445 +f 5450 5449 5444 +f 5451 5445 5446 +f 5451 5450 5445 +f 5411 5451 5446 +f 5402 5401 5447 +f 5448 5402 5447 +f 5403 5402 5448 +f 5406 5448 5449 +f 5406 5403 5448 +f 5406 5449 5450 +f 5408 5406 5450 +f 5410 5450 5451 +f 5410 5408 5450 +f 5411 5410 5451 +f 5452 5453 5454 +f 5455 5452 5454 +f 5456 5452 5455 +f 5457 5455 5458 +f 5457 5456 5455 +f 5459 5458 5460 +f 5459 5457 5458 +f 5461 5460 5462 +f 5461 5459 5460 +f 5401 5461 5462 +f 5463 5453 5452 +f 5464 5452 5456 +f 5464 5463 5452 +f 5465 5456 5457 +f 5465 5464 5456 +f 5466 5457 5459 +f 5466 5465 5457 +f 5461 5466 5459 +f 5467 5466 5461 +f 5401 5467 5461 +f 5468 5453 5463 +f 5469 5463 5464 +f 5469 5468 5463 +f 5470 5464 5465 +f 5470 5469 5464 +f 5470 5465 5466 +f 5471 5470 5466 +f 5472 5466 5467 +f 5472 5471 5466 +f 5401 5472 5467 +f 5473 5453 5468 +f 5474 5468 5469 +f 5474 5473 5468 +f 5475 5469 5470 +f 5475 5474 5469 +f 5476 5470 5471 +f 5476 5475 5470 +f 5472 5476 5471 +f 5477 5476 5472 +f 5401 5477 5472 +f 5478 5453 5473 +f 5479 5473 5474 +f 5479 5478 5473 +f 5480 5474 5475 +f 5480 5479 5474 +f 5481 5475 5476 +f 5481 5480 5475 +f 5482 5476 5477 +f 5482 5481 5476 +f 5401 5482 5477 +f 5483 5453 5478 +f 5484 5478 5479 +f 5484 5483 5478 +f 5484 5479 5480 +f 5485 5484 5480 +f 5486 5480 5481 +f 5486 5485 5480 +f 5487 5481 5482 +f 5487 5486 5481 +f 5401 5487 5482 +f 5488 5453 5483 +f 5489 5483 5484 +f 5489 5488 5483 +f 5489 5484 5485 +f 5490 5489 5485 +f 5491 5485 5486 +f 5491 5490 5485 +f 5492 5486 5487 +f 5492 5491 5486 +f 5401 5492 5487 +f 5493 5453 5488 +f 5494 5488 5489 +f 5494 5493 5488 +f 5495 5489 5490 +f 5495 5494 5489 +f 5496 5490 5491 +f 5496 5495 5490 +f 5497 5491 5492 +f 5497 5496 5491 +f 5401 5497 5492 +f 5498 5453 5493 +f 5499 5493 5494 +f 5499 5498 5493 +f 5500 5494 5495 +f 5500 5499 5494 +f 5501 5495 5496 +f 5501 5500 5495 +f 5502 5496 5497 +f 5502 5501 5496 +f 5401 5502 5497 +f 5454 5453 5498 +f 5455 5498 5499 +f 5455 5454 5498 +f 5458 5499 5500 +f 5458 5455 5499 +f 5460 5500 5501 +f 5460 5458 5500 +f 5502 5460 5501 +f 5462 5460 5502 +f 5401 5462 5502 +f 5500 5406 5458 +f 5500 5449 5406 +f 5495 5449 5500 +f 5495 5444 5449 +f 5490 5444 5495 +f 5490 5439 5444 +f 5485 5439 5490 +f 5485 5434 5439 +f 5480 5434 5485 +f 5480 5429 5434 +f 5480 5424 5429 +f 5475 5424 5480 +f 5470 5424 5475 +f 5470 5419 5424 +f 5465 5419 5470 +f 5465 5414 5419 +f 5465 5405 5414 +f 5457 5405 5465 +f 5458 5405 5457 +f 5458 5406 5405 diff --git a/data/ram_air_kite/ram_air_kite_foil_cd_polar.csv b/data/ram_air_kite/ram_air_kite_foil_cd_polar.csv deleted file mode 100644 index a90561b5..00000000 --- a/data/ram_air_kite/ram_air_kite_foil_cd_polar.csv +++ /dev/null @@ -1,22 +0,0 @@ -C_d/delta,δ=-3.0°,δ=-2.0°,δ=-1.0°,δ=0.0°,δ=1.0°,δ=2.0°,δ=3.0°,δ=4.0°,δ=5.0° -α=-5.0°,0.01433847021815847,0.014234262913251952,0.014137722606910217,0.014048185557831645,0.013964975262517137,0.013888562427211742,0.013819725823628885,0.013758770246532485,0.013705847025362672 -α=-4.0°,0.01392245576603625,0.013835570730418172,0.013755418260898695,0.013682553091892485,0.013616413024402262,0.01355760923896371,0.013506680188031311,0.013463164069954183,0.013426855205036684 -α=-3.0°,0.013599512272720072,0.013530695074674626,0.013468604797525032,0.013413112445164289,0.013364032531688578,0.013322045257170696,0.01328721298836,0.013260181740861573,0.013240400719169603 -α=-2.0°,0.013368223428975064,0.013315398051427368,0.013270007943025257,0.013231824364150602,0.013199699747804152,0.013174919819257747,0.013156961330477276,0.013145703553799775,0.01314145923015258 -α=-1.0°,0.013226892453658904,0.013190950609662994,0.01316147227484485,0.01313919202341541,0.013123144305470923,0.013114664971582105,0.013113740681432211,0.01311975357405749,0.013131926987567976 -α=0.0°,0.013172200730711757,0.013153249439746216,0.013141042145930657,0.01313541615862464,0.013135770923209712,0.013143292914670214,0.013157649720257382,0.013179830031750064,0.013208999254140218 -α=1.0°,0.013205576894386712,0.013202098086344146,0.013206362991049905,0.013217540523946919,0.013234532917258214,0.013259036702180647,0.013289860664570368,0.013327268846179597,0.013371486607151555 -α=2.0°,0.013329585907382714,0.013342014523426307,0.013361670096636403,0.013389092822959673,0.0134216429507464,0.013461749409672352,0.013509495558567036,0.013564143232209686,0.013624814198653882 -α=3.0°,0.013544194462889753,0.013573826551151894,0.01361022672603762,0.013653706472489199,0.01370268295988344,0.01375837517710747,0.013821231692585648,0.013891258466707801,0.01396928014628438 -α=4.0°,0.013853549841898667,0.013898941066453842,0.013951787531824114,0.014011803291311527,0.014077421757876176,0.014150586367023462,0.014230814144663496,0.014317509666265712,0.01441069792721431 -α=5.0°,0.014267653577432572,0.014328393402291969,0.014397249430917672,0.014474008891118696,0.014555950691784773,0.014644370720708793,0.014739768413486051,0.014843305833966725,0.014954616502254941 -α=6.0°,0.01478850693773963,0.014865387606226478,0.014950123110310144,0.015043631010042684,0.015142788014902877,0.015249281382586395,0.015363117032245186,0.015483658588192463,0.015611109301051364 -α=7.0°,0.015435153907665828,0.015528144806756345,0.01562912918092578,0.015738778577050715,0.015854213416764136,0.01597670489760254,0.016106801881945434,0.016245945292157463,0.01639311553906626 -α=8.0°,0.016217228888231426,0.01632669733065383,0.01644507451403529,0.016572144176916496,0.016705289261524793,0.01684704487881037,0.01699689973094661,0.017153554943088394,0.017317294354867337 -α=9.0°,0.017170703990803546,0.017349168426447792,0.017430564162049113,0.01757522531888232,0.01772563107453066,0.01788319095214265,0.01804901897369233,0.01822411769513696,0.018409072877984236 -α=10.0°,0.018328566365255795,0.018468708222284677,0.018620050346992427,0.018782024305755412,0.018950513154537333,0.01912817541133926,0.01931508212394238,0.019511083229147977,0.019713770897590244 -α=11.0°,0.01979328685667871,0.01994460369630283,0.020108897305692267,0.0202862092768749,0.020470512941000815,0.020662657925524245,0.02086464772476686,0.021076670375337996,0.021299203149476868 -α=12.0°,0.02181794440081981,0.021955588191086974,0.02211066262972091,0.022282828249923777,0.0224625791083464,0.02265027079241835,0.022857659852863924,0.023087414106765396,0.023336438121571663 -α=13.0°,0.028920037184458344,0.0287091342365759,0.028504102475747386,0.028301325732599705,0.028128688789504114,0.02795618180284888,0.027820586628728404,0.027761775909023897,0.027786651235713028 -α=14.0°,0.04607580351002419,0.046428387506936085,0.04691990856870641,0.04746475390856498,0.04801602781258744,0.048541430833714753,0.04909764117061989,0.04969843935522057,0.05041949823136555 -α=15.0°,0.06392463676243207,0.06498535271340136,0.06610616591863448,0.06727118410885709,0.06854709337048101,0.06995458363203855,0.07130705027776803,0.07267330739823699,0.07407240831539721 diff --git a/data/ram_air_kite/ram_air_kite_foil_cl_polar.csv b/data/ram_air_kite/ram_air_kite_foil_cl_polar.csv deleted file mode 100644 index 4411ff67..00000000 --- a/data/ram_air_kite/ram_air_kite_foil_cl_polar.csv +++ /dev/null @@ -1,22 +0,0 @@ -C_l/delta,δ=-3.0°,δ=-2.0°,δ=-1.0°,δ=0.0°,δ=1.0°,δ=2.0°,δ=3.0°,δ=4.0°,δ=5.0° -α=-5.0°,-0.6969207532107704,-0.6635279438822711,-0.6298205189765163,-0.5958579862261623,-0.5615198709927092,-0.5270266574955196,-0.4925526049689456,-0.4581580534853617,-0.42390290599976765 -α=-4.0°,-0.5884471478727719,-0.554682053341145,-0.5206187505454236,-0.486303435120333,-0.45167596999323345,-0.4168944702697655,-0.38214141673178637,-0.3474685101667754,-0.3129284129758894 -α=-3.0°,-0.47851839581402067,-0.4444502609291441,-0.41008863576812543,-0.37548490172771354,-0.34063645373564844,-0.30563312555389116,-0.27065728211599127,-0.23576531727489908,-0.2010095357154626 -α=-2.0°,-0.36744758746965606,-0.3331633317875624,-0.2985805171746826,-0.2637522736112876,-0.22874385748889045,-0.1935848985329009,-0.1584525329743452,-0.12339736686996096,-0.08847278907672629 -α=-1.0°,-0.2555502622378129,-0.22110433376123417,-0.18636834401400265,-0.15138865034570295,-0.1162807303985349,-0.08101938510517342,-0.04578816612802784,-0.010634098760822717,0.024396333751105594 -α=0.0°,-0.14309486661658563,-0.10855413701910849,-0.07372048112552225,-0.03864663658280385,-0.0035007962714927485,0.031800114402520493,0.06707601559074972,0.10227185610419243,0.1373428121465872 -α=1.0°,-0.030319531106272425,0.004243125627475152,0.03910942041764013,0.07421841270024074,0.10934206812461672,0.14461650943525953,0.1798692731390081,0.21505053397084828,0.2501111702568733 -α=2.0°,0.08250741857125816,0.11703750329440508,0.15186970292369142,0.18695062211893107,0.22199232276530798,0.257186425115852,0.29235312959231763,0.32744768543037506,0.3624275876261976 -α=3.0°,0.1951216525144025,0.22956063413697927,0.26430038008195494,0.29928554459250345,0.3341811446194995,0.3692301757048088,0.40425883181042915,0.4392162001515247,0.474046556710144 -α=4.0°,0.30724490932915144,0.34152743227529414,0.3761157987125168,0.4109481790718728,0.4456351446852075,0.48046833031179587,0.5152774474099953,0.5500190506084954,0.5846455009698628 -α=5.0°,0.41852816808692905,0.452581125686124,0.4869503650625556,0.5215663795541023,0.5559818101548548,0.5905460469588848,0.6250870941800228,0.6595455898134065,0.6938755594504877 -α=6.0°,0.5285851506157049,0.5623528056316242,0.59643550854656,0.6307670337481267,0.6648373025879607,0.6990448635009306,0.7332238437749503,0.7673275475437072,0.8013063577312233 -α=7.0°,0.6368459543764756,0.6702670563834741,0.7040041718715597,0.737987381930342,0.771646427914723,0.8054418430442236,0.839203013462149,0.8728630343905056,0.9063801168007298 -α=8.0°,0.7426486162006611,0.7756518755586836,0.8089732246680822,0.8425358261920711,0.8756970142545881,0.9089705543978093,0.9421979485172498,0.9753362463197753,1.0083309992698017 -α=9.0°,0.8448352747334552,0.876086300779509,0.9102014429784994,0.9432700434363921,0.9758522327958289,1.0085476550885975,1.0411859771016678,1.0736967123835974,1.106015680097371 -α=10.0°,0.9416753731053946,0.9736566098473974,1.0059456021270003,1.0384466522593712,1.0703404803643017,1.1023030474892,1.1341777876793402,1.165903139478142,1.1974467444584302 -α=11.0°,1.0292654845636027,1.0606832186005946,1.0923856355279902,1.1242524246451389,1.1553419764205732,1.1864839506468585,1.2174958940950562,1.2483021850990688,1.278825127416085 -α=12.0°,1.096333871087732,1.1273653380836937,1.1584053843543214,1.1892547274591465,1.2185911066325041,1.2477804043570164,1.2765234898699485,1.3050721259174194,1.333395978877381 -α=13.0°,1.0808644313813403,1.1137770010407946,1.147066023095559,1.1806546823949344,1.2130878295190561,1.2458777409812936,1.2787446452938451,1.3112861220239256,1.343245771448156 -α=14.0°,1.008213209219276,1.0375839337456372,1.06621023277239,1.0946810951337835,1.1220127398782962,1.1496504578226292,1.1771050761003297,1.2042127332052377,1.2303206920386454 -α=15.0°,0.9374612663588641,0.9619552841252303,0.9866127270747307,1.0113986352522282,1.0344210823178435,1.0566800062900217,1.079493823354485,1.1023489905968151,1.1251529191886862 diff --git a/data/ram_air_kite/ram_air_kite_foil_cm_polar.csv b/data/ram_air_kite/ram_air_kite_foil_cm_polar.csv deleted file mode 100644 index 48cafaf7..00000000 --- a/data/ram_air_kite/ram_air_kite_foil_cm_polar.csv +++ /dev/null @@ -1,22 +0,0 @@ -C_m/delta,δ=-3.0°,δ=-2.0°,δ=-1.0°,δ=0.0°,δ=1.0°,δ=2.0°,δ=3.0°,δ=4.0°,δ=5.0° -α=-5.0°,0.043826863160225944,0.0376990079484319,0.031500695245476745,0.025243967146348637,0.01891093618106503,0.012534504856068966,0.0061631162248936425,-0.00019073275778902732,-0.0065144416691771895 -α=-4.0°,0.045822829983601265,0.03960669958263457,0.033322927782512946,0.026981770294765575,0.02057661421208944,0.01412882608594442,0.007687474102397749,0.001264073090513696,-0.005129467523270142 -α=-3.0°,0.047566595857269155,0.04127866805642023,0.03492430171306586,0.028514324014665412,0.02205296112868164,0.015549521285243223,0.009052941212532072,0.0025748894046463376,-0.0038732131492137663 -α=-2.0°,0.049094250547447114,0.04275309666808862,0.036345203785097334,0.02988187843852131,0.023379127192503037,0.01683495341677346,0.010298129948931034,0.0037795835484021496,-0.002709553529007066 -α=-1.0°,0.05043981045759721,0.04405997698983699,0.037614754434927476,0.031114633467400746,0.02458551072961674,0.018015095094384703,0.011452505517593598,0.004908273975500567,-0.0016068423029144217 -α=0.0°,0.05163351702548777,0.04523061111119839,0.038762289143927486,0.03223985069271094,0.02569929140479854,0.019117819974994142,0.012544019822725003,0.005989030902941364,-0.0005368985519186318 -α=1.0°,0.0527003485241073,0.04629123498788505,0.039815419991742255,0.033285524784323325,0.02674823469852836,0.020170832066813506,0.01360127951219067,0.007050007681831878,0.0005275097644067711 -α=2.0°,0.05366739738633625,0.04726654050810349,0.04079927999441735,0.0342773221389168,0.027758545227802685,0.021200046406186012,0.014650000535173516,0.008118561480202824,0.0016157171607740532 -α=3.0°,0.05456262170672576,0.04818470312200639,0.041740590829973216,0.03524262794685185,0.02875768594348558,0.022233911560453373,0.015718151672798643,0.009221228859856052,0.002754340998373771 -α=4.0°,0.0554138927372225,0.049075093163181066,0.04266957406516957,0.03621046296465551,0.029774773583870814,0.023301754668776122,0.016837690465188376,0.010392658417237263,0.003976877736315516 -α=5.0°,0.05625419140052225,0.04997165620571062,0.04362111662336467,0.03721686267385789,0.030846434368998983,0.024439560905100313,0.018041973297261513,0.011665293871570344,0.0053198170067533836 -α=6.0°,0.05712385980686547,0.05091257067887753,0.04463343394726973,0.03830049472328021,0.03201225781658698,0.025689867940918685,0.01937792809064283,0.013087161057649788,0.006828020954739421 -α=7.0°,0.05807458454804842,0.05195135419914438,0.04576006579372884,0.039515536662541866,0.0333268725009441,0.027105695270000667,0.020896141945372246,0.014710865192218269,0.008559941756870583 -α=8.0°,0.059172573633786245,0.053155255356289594,0.047069568732580135,0.04093153892637295,0.034862160828839306,0.028764170058092238,0.022679870551243313,0.016619939612974713,0.010595600538975786 -α=9.0°,0.06052288296375028,0.054723747392549704,0.04867035855406123,0.04265920145668376,0.036730515792403017,0.03077544237295167,0.02483590754214945,0.018925310632650724,0.013056399409592393 -α=10.0°,0.06229058111885184,0.056546492696097704,0.05073419668091021,0.04487317112367253,0.03911203635071391,0.03333104093748423,0.027569834740203986,0.021841320239615884,0.016155658434166022 -α=11.0°,0.06482916701832558,0.059261963031610264,0.053627222894967116,0.047947929157552534,0.042391401411833084,0.03681963131645459,0.03127291847520705,0.02576609989946642,0.020314187203999245 -α=12.0°,0.06915965775741145,0.06383532267960472,0.058472991118352746,0.05311111830133327,0.04797697668394526,0.04285789341196618,0.03780027687856615,0.0327723750489221,0.027779600406276656 -α=13.0°,0.07443496331034165,0.06970182531827732,0.06492392713842711,0.06012627313900721,0.05546760604651512,0.05079444589818944,0.04607973772130575,0.041290913170959745,0.03643736849027357 -α=14.0°,0.07017317551233836,0.06503378322427572,0.059780333862149426,0.05447551565247198,0.04932957841116617,0.044207960780669874,0.03909723854041173,0.03400157452858572,0.02889506054825987 -α=15.0°,0.06436441413581068,0.05881975650466044,0.05318076648977976,0.04748424558549021,0.041886643469110134,0.03623130536672073,0.030621258553146867,0.025033923262445624,0.019471074365576546 diff --git a/docs/src/functions.md b/docs/src/functions.md index 9643987c..37d63565 100644 --- a/docs/src/functions.md +++ b/docs/src/functions.md @@ -8,6 +8,31 @@ refine! calculate_span calculate_projected_area load_polar_data +obj_to_yaml +perpendicular_sections +fit_kulfan_parameters +KulfanFitMethod +LeastSquaresFit +EnvelopeFit +``` + +## Surface-pressure (Cp) tables +```@docs +AbstractAirfoilSolver +XFoilSolver +NeuralFoilSolver +SectionSolution +DeformedSection +deform_section +analyze_section +analyze_sweep +CpData +CpPolar +generate_cp_polar +read_cp_data +write_cp_data +cp_distribution +delta_cp ``` ## Setting the inflow conditions and solving @@ -28,6 +53,8 @@ plot_distribution plot_polars plot_polar_data plot_combined_analysis +plot_airfoils +plot_section_polars ``` ## Helper Functions diff --git a/docs/src/types.md b/docs/src/types.md index 9548a7d4..6fbbd119 100644 --- a/docs/src/types.md +++ b/docs/src/types.md @@ -7,6 +7,7 @@ Model WingType AeroModel PanelDistribution +PanelGroupingMethod InitialGammaDistribution SolverType SolverStatus diff --git a/examples/Project.toml b/examples/Project.toml index e4e6ad0f..2241d9e7 100644 --- a/examples/Project.toml +++ b/examples/Project.toml @@ -1,10 +1,12 @@ [deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab" DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" +Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" VortexStepMethod = "ed3cd733-9f0f-46a9-93e0-89b8d4998dd9" diff --git a/examples/V3_kite.jl b/examples/V3_kite.jl index 7e4caea5..08169f1e 100644 --- a/examples/V3_kite.jl +++ b/examples/V3_kite.jl @@ -1,3 +1,7 @@ +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end using LinearAlgebra using VortexStepMethod @@ -219,4 +223,4 @@ PLOT && plot_polars( use_tex=USE_TEX ) -nothing +nothing \ No newline at end of file diff --git a/examples/V3_neuralfoil.jl b/examples/V3_neuralfoil.jl new file mode 100644 index 00000000..c204184e --- /dev/null +++ b/examples/V3_neuralfoil.jl @@ -0,0 +1,126 @@ +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end +using GLMakie +using VortexStepMethod +using LinearAlgebra + +# Configuration +OBJ_PATH = joinpath("data", "TUDELFT_V3_KITE", "V3_25.obj") +POLARS_DIR = joinpath("data", "TUDELFT_V3_KITE", "polars_neuralfoil") +N_SLICES = 19 # Match number of CFD polars +RE = 1e6 + +# Generate NeuralFoil polars if they don't exist +if !isdir(POLARS_DIR) || length(readdir(POLARS_DIR)) < N_SLICES + println("Generating NeuralFoil polars from OBJ mesh...") + + # Plot airfoil slices to verify + fig_slices = plot_airfoil_slices(OBJ_PATH; n_slices=N_SLICES, is_show=false) + save("V3_slices.png", fig_slices) + println("Saved V3_slices.png") + + generate_neuralfoil_polars( + OBJ_PATH, + POLARS_DIR; + n_slices=N_SLICES, + Re=RE, + verbose=true + ) +end + +# Flight conditions +v_a = 10.0 +angle_range = range(-5, 25, length=31) + +# Load settings and create wing with CFD polars +println("\nCreating wing with CFD polars...") +settings_cfd = VSMSettings("TUDELFT_V3_KITE/vsm_settings.yaml") +wing_cfd = Wing(settings_cfd) +refine!(wing_cfd) +body_cfd = BodyAerodynamics([wing_cfd]) +VortexStepMethod.reinit!(body_cfd) +solver_cfd = Solver(body_cfd, settings_cfd) + +# Create modified settings for NeuralFoil polars +println("Creating wing with NeuralFoil polars...") + +# Read and modify the YAML to use neuralfoil polars +using YAML +yaml_path = joinpath("data", "TUDELFT_V3_KITE", "aero_geometry.yaml") +geom = YAML.load_file(yaml_path) + +# Update airfoil entries to use neuralfoil polars +for (i, airfoil) in enumerate(geom["wing_airfoils"]["data"]) + airfoil[2] = "polars" + airfoil[3] = Dict("csv_file_path" => "polars_neuralfoil/$i.csv") +end + +# Write temporary modified geometry +temp_yaml = joinpath("data", "TUDELFT_V3_KITE", "aero_geometry_neuralfoil.yaml") +YAML.write_file(temp_yaml, geom) + +# Create settings pointing to modified geometry +settings_nf = VSMSettings("TUDELFT_V3_KITE/vsm_settings.yaml") +# Manually update the geometry file reference in the wing +wing_nf = Wing(settings_nf) +# Replace sections with NeuralFoil polars +for (i, section) in enumerate(wing_nf.unrefined_sections) + polar_path = joinpath(POLARS_DIR, "$i.csv") + if isfile(polar_path) + aero_data, _ = load_polar_data(polar_path) + wing_nf.unrefined_sections[i] = Section( + section.LE_point, section.TE_point, POLAR_VECTORS, aero_data + ) + end +end +refine!(wing_nf) +body_nf = BodyAerodynamics([wing_nf]) +VortexStepMethod.reinit!(body_nf) +solver_nf = Solver(body_nf, settings_nf) + +# Compute polars +function compute_polar(solver, body_aero, angle_range; v_a=10.0) + cl = zeros(length(angle_range)) + cd = zeros(length(angle_range)) + + for (i, aoa_deg) in enumerate(angle_range) + α = deg2rad(aoa_deg) + vel = [cos(α), 0.0, sin(α)] * v_a + set_va!(body_aero, vel) + results = VortexStepMethod.solve(solver, body_aero; log=false) + cl[i] = results["cl"] + cd[i] = results["cd"] + end + return cl, cd +end + +println("\nComputing CFD polar...") +cl_cfd, cd_cfd = compute_polar(solver_cfd, body_cfd, angle_range; v_a) + +println("Computing NeuralFoil polar...") +cl_nf, cd_nf = compute_polar(solver_nf, body_nf, angle_range; v_a) + +# Plot comparison +fig = Figure(size=(1200, 500)) + +ax1 = Axis(fig[1, 1]; xlabel="α [°]", ylabel="CL [-]", title="Lift Coefficient") +lines!(ax1, collect(angle_range), cl_cfd; label="CFD polars", linewidth=2) +lines!(ax1, collect(angle_range), cl_nf; label="NeuralFoil polars", linewidth=2) +axislegend(ax1; position=:rb) + +ax2 = Axis(fig[1, 2]; xlabel="α [°]", ylabel="CD [-]", title="Drag Coefficient") +lines!(ax2, collect(angle_range), cd_cfd; label="CFD polars", linewidth=2) +lines!(ax2, collect(angle_range), cd_nf; label="NeuralFoil polars", linewidth=2) +axislegend(ax2; position=:lt) + +ax3 = Axis(fig[1, 3]; xlabel="CD [-]", ylabel="CL [-]", title="Drag Polar") +lines!(ax3, cd_cfd, cl_cfd; label="CFD polars", linewidth=2) +lines!(ax3, cd_nf, cl_nf; label="NeuralFoil polars", linewidth=2) +axislegend(ax3; position=:rb) + +Label(fig[0, :], "TU Delft V3 Kite: CFD vs NeuralFoil (v=$v_a m/s, Re=$RE)"; fontsize=20) + +display(fig) +nothing diff --git a/examples/bench.jl b/examples/bench.jl index 227e7c2f..ff69617f 100644 --- a/examples/bench.jl +++ b/examples/bench.jl @@ -1,3 +1,7 @@ +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end using LinearAlgebra using VortexStepMethod using VortexStepMethod: solve_base! diff --git a/examples/billowing.jl b/examples/billowing.jl index abb27b27..1f6b886f 100644 --- a/examples/billowing.jl +++ b/examples/billowing.jl @@ -1,3 +1,7 @@ +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end using LinearAlgebra using VortexStepMethod @@ -180,4 +184,4 @@ if PLOT ) end -nothing +nothing \ No newline at end of file diff --git a/examples/cleanup.jl b/examples/cleanup.jl index 6742117b..b922903a 100644 --- a/examples/cleanup.jl +++ b/examples/cleanup.jl @@ -1,3 +1,7 @@ +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end # Delete the generated polars. # Useful if you want to benchmark the polar generation or if you have changed parameters. @@ -6,4 +10,4 @@ file2="data/ram_air_kite/ram_air_kite_foil_cd_polar.csv" file3="data/ram_air_kite/ram_air_kite_foil_cm_polar.csv" isfile(file1) && rm(file1) isfile(file2) && rm(file2) -isfile(file3) && rm(file3) +isfile(file3) && rm(file3) \ No newline at end of file diff --git a/examples/menu.jl b/examples/menu.jl index 41755fbd..38a986c6 100644 --- a/examples/menu.jl +++ b/examples/menu.jl @@ -16,6 +16,7 @@ example_files = [ "pyramid_model.jl", "rectangular_wing.jl", "ram_air_kite.jl", + "obj_to_yaml_kite.jl", "stall_model.jl", "bench.jl", "linearize_check.jl", diff --git a/examples/obj_to_yaml_kite.jl b/examples/obj_to_yaml_kite.jl new file mode 100644 index 00000000..1fc2094b --- /dev/null +++ b/examples/obj_to_yaml_kite.jl @@ -0,0 +1,89 @@ +""" +Convert a 3D wing `.obj` mesh to the native YAML geometry route with the +NeuralFoil adapter, then load and solve it like any other YAML wing. + +The adapter slices the mesh, fits each section to Kulfan parameters, evaluates +NeuralFoil, and writes `airfoils/*.dat`, `polars/*.csv`, and a `geometry.yaml`. + +This example fits each section with `EnvelopeFit`, which wraps tightly around the +slice points with clearance `min_distance` instead of least-squaring through +them. The envelope is robust to the noisy interior-structure points (ribs, spars) +of a ram-air kite slice that otherwise pull the default `LeastSquaresFit` inward. +""" + +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end +using GLMakie +using VortexStepMethod +using LinearAlgebra + +PLOT = true +USE_TEX = false +v_a = 15.0 +project_dir = dirname(@__DIR__) +obj_path = joinpath(project_dir, "data", "ram_air_kite", "ram_air_kite_body.obj") +output_dir = joinpath(project_dir, "output", "ram_air_kite_converted") + +# --- Convert the .obj mesh to the YAML route --- +println("Converting $(basename(obj_path)) to YAML...") +geometry_file = obj_to_yaml(obj_path, output_dir; + n_sections=36, Re=5e5, alpha_range=-20:1:20, model_size="xlarge", + fit_method=EnvelopeFit(min_distance=0.0001)) + +# --- Report per-section fit error: how far any raw point sticks OUTSIDE the +# fitted envelope (interior structure points are ignored by the envelope fit). --- +function max_outside(x_fit, y_fit, x_raw, y_raw) + isempty(x_raw) && return 0.0 + le = argmin(x_fit) + xu, yu = reverse(x_fit[1:le]), reverse(y_fit[1:le]) + xl, yl = x_fit[le:end], y_fit[le:end] + interp(xs, ys, px) = begin + px <= xs[1] && return ys[1] + px >= xs[end] && return ys[end] + k = searchsortedfirst(xs, px) + t = (px - xs[k-1]) / (xs[k] - xs[k-1]) + ys[k-1] + t * (ys[k] - ys[k-1]) + end + v = 0.0 + for (px, py) in zip(x_raw, y_raw) + uy = interp(xu, yu, px) + ly = interp(xl, yl, px) + v = max(v, py > uy ? py - uy : (py < ly ? ly - py : 0.0)) + end + return v +end + +println("Per-section fit error (max raw point outside the fitted envelope):") +for af in VortexStepMethod.airfoils_from_yaml(geometry_file) + err = max_outside(af.x, af.y, af.x_raw, af.y_raw) + println(" Airfoil $(af.id): max_outside=$(round(err, digits=4))" * + (err > 0.01 ? " <-- poor fit" : "")) +end + +# --- Everything below is the standard YAML wing route --- +wing = Wing(geometry_file; n_panels=20, spanwise_distribution=LINEAR) +refine!(wing) +body_aero = BodyAerodynamics([wing]) +VortexStepMethod.reinit!(body_aero) + +solver = Solver(body_aero; aerodynamic_model_type=VSM, rtol=1e-5, solver_type=NONLIN) +set_va!(body_aero, [cos(deg2rad(8)) * v_a, 0.0, sin(deg2rad(8)) * v_a]) +results = VortexStepMethod.solve(solver, body_aero; log=true) + +if PLOT + plot_geometry(body_aero, "Ram air kite (converted from .obj)"; is_show=true, + view_elevation=15, view_azimuth=-120, use_tex=USE_TEX) + + # Airfoils and per-section polars recovered from the converted geometry + plot_airfoils(geometry_file; symmetric=true, is_show=true) + plot_section_polars(body_aero, :cl; is_show=true) + plot_section_polars(body_aero, :cd; is_show=true) + + plot_polars([solver], [body_aero], ["VSM (NeuralFoil polars from .obj)"]; + angle_range=range(-5, 20, length=26), v_a=v_a, + title="Ram air kite: obj_to_yaml route", is_save=false, use_tex=USE_TEX) +end + +nothing diff --git a/examples/pyramid_model.jl b/examples/pyramid_model.jl index cb8ee74e..9fe18074 100644 --- a/examples/pyramid_model.jl +++ b/examples/pyramid_model.jl @@ -1,3 +1,7 @@ +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end using LinearAlgebra using VortexStepMethod @@ -71,4 +75,4 @@ PLOT && plot_distribution( use_tex=USE_TEX ) -nothing +nothing \ No newline at end of file diff --git a/examples/ram_air_kite.jl b/examples/ram_air_kite.jl index 8deb6973..edf6d056 100644 --- a/examples/ram_air_kite.jl +++ b/examples/ram_air_kite.jl @@ -1,123 +1,54 @@ +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end +using GLMakie using VortexStepMethod using LinearAlgebra PLOT = true -PRN = true -SAVE_ALL = false +PRN = false USE_TEX = false DEFORM = true -LINEARIZE = false -OUTPUT_DIR = joinpath(dirname(@__DIR__), "output") +v_a = 15.0 -# Create wing geometry -wing = ObjWing( +# Create wing with XFoil polars +println("Creating XFoil wing...") +wing_xfoil = ObjWing( joinpath("data", "ram_air_kite", "ram_air_kite_body.obj"), joinpath("data", "ram_air_kite", "ram_air_kite_foil.dat"); - n_unrefined_sections=2, + n_unrefined_sections=10, prn=PRN ) -body_aero = BodyAerodynamics([wing];) -println("First init") -@time VortexStepMethod.reinit!(body_aero) +body_xfoil = BodyAerodynamics([wing_xfoil]) +VortexStepMethod.reinit!(body_xfoil) +solver_xfoil = Solver(body_xfoil; aerodynamic_model_type=VSM, rtol=1e-5, solver_type=NONLIN) -if DEFORM - # Linear interpolation of alpha from 10° at one tip to 0° at the other - println("Deform") - @time VortexStepMethod.unrefined_deform!( - wing, deg2rad.([-10,0]), deg2rad.([0,0]); smooth=true) - println("Deform init") - @time VortexStepMethod.reinit!(body_aero; init_aero=false) -end - -# Create solvers -solver = Solver(body_aero; - aerodynamic_model_type=VSM, - is_with_artificial_damping=false, - rtol=1e-5, - solver_type=NONLIN +# Create wing with NeuralFoil polars +println("Creating NeuralFoil wing...") +wing_nf = ObjWing( + joinpath("data", "ram_air_kite", "ram_air_kite_body.obj"), + joinpath("data", "ram_air_kite", "ram_air_kite_foil.dat"); + n_unrefined_sections=10, + polars_dir=joinpath("data", "ram_air_kite", "polars_neuralfoil"), + prn=PRN ) - -# Setting velocity conditions -v_a = 15.0 -aoa = 10.0 -side_slip = 0.0 -yaw_rate = 0.0 -aoa_rad = deg2rad(aoa) -vel_app = [ - cos(aoa_rad) * cos(side_slip), - sin(side_slip), - sin(aoa_rad) -] * v_a -set_va!(body_aero, vel_app) - -if LINEARIZE - println("Linearize") - jac, res = VortexStepMethod.linearize( - solver, - body_aero, - [zeros(4); vel_app; zeros(3)]; - theta_idxs=1:4, - va_idxs=5:7, - omega_idxs=8:10, - moment_frac=0.1) - @time jac, res = VortexStepMethod.linearize( - solver, - body_aero, - [zeros(4); vel_app; zeros(3)]; - theta_idxs=1:4, - va_idxs=5:7, - omega_idxs=8:10, - moment_frac=0.1) +body_nf = BodyAerodynamics([wing_nf]) +VortexStepMethod.reinit!(body_nf) +solver_nf = Solver(body_nf; aerodynamic_model_type=VSM, rtol=1e-5, solver_type=NONLIN) + +# Compare using plot_polars +if PLOT + println("Computing and plotting polars...") + plot_polars( + [solver_xfoil, solver_nf], + [body_xfoil, body_nf], + ["XFoil", "NeuralFoil"]; + angle_range=range(-5, 25, length=31), + v_a=v_a, + title="Ram Air Kite: XFoil vs NeuralFoil", + is_save=false, + use_tex=USE_TEX + ) end - -# Plotting polar data -PLOT && plot_polar_data(body_aero) - -# Plotting geometry -PLOT && plot_geometry( - body_aero, - "Ram air kite geometry"; - save_path=OUTPUT_DIR, - is_save=false || SAVE_ALL, - is_show=true, - view_elevation=15, - view_azimuth=-120, - use_tex=USE_TEX -) - -# Solving and plotting distributions -println("Solve") -results = VortexStepMethod.solve(solver, body_aero; log=true) -@time VortexStepMethod.solve(solver, body_aero; log=true) - -body_y_coordinates = [panel.aero_center[2] for panel in body_aero.panels] - -PLOT && plot_distribution( - [body_y_coordinates], - [results], - ["VSM"]; - title="CAD_spanwise_distributions_alpha_$(round(aoa, digits=1))_delta_$(round(side_slip, digits=1))_yaw_$(round(yaw_rate, digits=1))_v_a_$(round(v_a, digits=1))", - save_path=OUTPUT_DIR, - is_save=false || SAVE_ALL, - is_show=true, - use_tex=USE_TEX -) - -PLOT && plot_polars( - [solver], - [body_aero], - [ - "VSM from Ram Air Kite OBJ and DAT file", - ]; - angle_range=range(0, 20, length=20), - angle_type="angle_of_attack", - angle_of_attack=0, - side_slip=0, - v_a=10, - title="ram_kite_panels_$(wing.n_panels)_distribution_$(wing.spanwise_distribution)", - save_path=OUTPUT_DIR, - is_save=false || SAVE_ALL, - is_show=true, - use_tex=USE_TEX -) -nothing +nothing \ No newline at end of file diff --git a/examples/rectangular_wing.jl b/examples/rectangular_wing.jl index b576b026..1c536573 100644 --- a/examples/rectangular_wing.jl +++ b/examples/rectangular_wing.jl @@ -1,3 +1,7 @@ +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end using LinearAlgebra using VortexStepMethod @@ -94,4 +98,4 @@ PLOT && plot_polars( is_save=false || SAVE_ALL, use_tex=USE_TEX ) -nothing +nothing \ No newline at end of file diff --git a/examples/show_slices.jl b/examples/show_slices.jl new file mode 100644 index 00000000..b3a4af74 --- /dev/null +++ b/examples/show_slices.jl @@ -0,0 +1,15 @@ +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end +using GLMakie +using VortexStepMethod + +# Change this to the OBJ file you want to slice +OBJ_PATH = joinpath("data", "TUDELFT_V3_KITE", "V3_25.obj") +# OBJ_PATH = joinpath("data", "ram_air_kite", "ram_air_kite_body.obj") + +N_SLICES = 10 + +println("Slicing: $OBJ_PATH") +fig = plot_airfoil_slices(OBJ_PATH; n_slices=N_SLICES) \ No newline at end of file diff --git a/examples/stall_model.jl b/examples/stall_model.jl index 8b9676e2..7fe795b9 100644 --- a/examples/stall_model.jl +++ b/examples/stall_model.jl @@ -1,3 +1,7 @@ +using Pkg +if Base.active_project() != joinpath(@__DIR__, "Project.toml") + Pkg.activate(@__DIR__) +end using LinearAlgebra using VortexStepMethod @@ -130,4 +134,4 @@ PLOT && plot_polars( is_show=true, use_tex=USE_TEX ) -nothing +nothing \ No newline at end of file diff --git a/ext/VortexStepMethodMakieExt.jl b/ext/VortexStepMethodMakieExt.jl index 7f3b7a42..2b90c5f3 100644 --- a/ext/VortexStepMethodMakieExt.jl +++ b/ext/VortexStepMethodMakieExt.jl @@ -3,7 +3,8 @@ using Makie, VortexStepMethod, LinearAlgebra, Statistics, DelimitedFiles import VortexStepMethod: calculate_filaments_for_plotting export plot_geometry, plot_distribution, plot_polars, save_plot, show_plot, - plot_polar_data, plot_combined_analysis + plot_polar_data, plot_combined_analysis, plot_airfoil_slices, plot_airfoils, + plot_section_polars # Set this extension as the active plotting backend when loaded (only if not already set) function __init__() @@ -1307,4 +1308,276 @@ function VortexStepMethod.plot_combined_analysis( return fig end +# ============================================================================ +# Airfoil Slice and Kulfan Fit Visualization +# ============================================================================ + +""" + plot_airfoil_slices(obj_path::String; n_slices=5, is_show=true, + save_path=nothing, data_type=".png") + +Plot airfoil cross-sections extracted from OBJ mesh with Kulfan CST fits overlaid. + +# Arguments +- `obj_path`: Path to OBJ file + +# Keyword Arguments +- `n_slices`: Number of spanwise slices (default 5) +- `is_show`: Display figure (default true) +- `save_path`: Directory to save figure (default nothing) +- `data_type`: Image format (default ".png") + +# Returns +- Makie Figure object +""" +function VortexStepMethod.plot_airfoil_slices(obj_path::String; n_slices::Int=5, + is_show::Bool=true, + save_path=nothing, + data_type::String=".png") + # Slice the mesh + airfoils, y_positions = VortexStepMethod.slice_obj_wing(obj_path, n_slices) + + # Determine grid layout + n_cols = min(3, n_slices) + n_rows = ceil(Int, n_slices / n_cols) + + fig = Figure(size=(400 * n_cols, 350 * n_rows)) + Label(fig[0, :], "Airfoil Slices from OBJ with Kulfan CST Fits", fontsize=16) + + for (i, ((x_slice, y_slice), y_pos)) in enumerate(zip(airfoils, y_positions)) + row = div(i - 1, n_cols) + 1 + col = mod1(i, n_cols) + + ax = Axis(fig[row, col]; + title="Slice $i (y=$(round(y_pos, digits=3)))", + xlabel="x/c", + ylabel="y/c", + aspect=DataAspect()) + + if isempty(x_slice) || length(x_slice) < 5 + text!(ax, 0.5, 0.5, text="No data", align=(:center, :center)) + continue + end + + # Get normalized coordinates for visualization + x_norm, y_norm, _ = VortexStepMethod.normalize_airfoil(x_slice, y_slice) + + # Plot slice points + scatter!(ax, x_norm, y_norm; + color=:blue, markersize=4, + label="$(length(x_norm)) pts") + + # Try Kulfan fit + try + params = VortexStepMethod.fit_kulfan_parameters(x_slice, y_slice) + + # Check if fit is reasonable (TE thickness should be small) + if abs(params.TE_thickness) < 1.0 + # Generate fitted curve + x_fit, y_fit = VortexStepMethod.kulfan_to_coordinates(params; n_points=100) + + # Plot fitted curve + lines!(ax, x_fit, y_fit; + color=:red, linewidth=2, label="Kulfan fit") + + # Add TE thickness annotation + text!(ax, 0.02, 0.98; + text="TE=$(round(params.TE_thickness, digits=4))", + align=(:left, :top), + fontsize=10, + space=:relative) + end + catch e + # Silently skip fit - just show points + end + + # Add legend only to first plot + if i == 1 + axislegend(ax; position=:rt) + end + end + + if !isnothing(save_path) + VortexStepMethod.save_plot(fig, save_path, "airfoil_slices"; data_type) + end + + if is_show + display(fig) + end + + return fig +end + +""" + plot_airfoil_fit(x::Vector, y::Vector; title="Airfoil Fit", is_show=true) + +Plot a single airfoil with its Kulfan CST fit. + +# Arguments +- `x, y`: Airfoil coordinates + +# Keyword Arguments +- `title`: Plot title +- `is_show`: Display figure + +# Returns +- Makie Figure object +- KulfanParameters +""" +function plot_airfoil_fit(x::Vector, y::Vector; title::String="Airfoil Fit", + is_show::Bool=true) + fig = Figure(size=(800, 400)) + ax = Axis(fig[1, 1]; + title=title, + xlabel="x/c", + ylabel="y/c", + aspect=DataAspect()) + + # Normalize coordinates + x_norm, y_norm, _ = VortexStepMethod.normalize_airfoil(x, y) + + # Plot original points + scatter!(ax, x_norm, y_norm; + color=:blue, markersize=6, label="Input ($(length(x)) pts)") + + # Fit Kulfan parameters + params = VortexStepMethod.fit_kulfan_parameters(x, y) + + # Generate fitted curve + x_fit, y_fit = VortexStepMethod.kulfan_to_coordinates(params; n_points=150) + + # Plot fitted curve + lines!(ax, x_fit, y_fit; + color=:red, linewidth=2, linestyle=:dash, label="Kulfan fit") + + # Add parameter info + info_text = """ + Upper: $(round.(params.upper_weights[1:4], digits=3))... + Lower: $(round.(params.lower_weights[1:4], digits=3))... + LE: $(round(params.leading_edge_weight, digits=3)) + TE: $(round(params.TE_thickness, digits=5)) + """ + + ax_info = Axis(fig[1, 2]; title="Kulfan Parameters") + hidedecorations!(ax_info) + hidespines!(ax_info) + text!(ax_info, 0.1, 0.9; + text=info_text, + align=(:left, :top), + fontsize=12) + + axislegend(ax; position=:rt) + + if is_show + display(fig) + end + + return fig, params +end + +""" + plot_airfoils(geometry_file, ::MakieBackend; overlay=nothing, symmetric=false, + idxs=nothing, n_cols=3, is_show=true, is_save=false, + save_path=nothing, data_type=".png") + +Makie backend implementation of [`plot_airfoils`](@ref). + +With `overlay=false` each airfoil gets its own subplot; with `overlay=true` all +airfoils are drawn on one axis coloured by section. By default (`overlay=nothing`) +the overlay is used when there are more than 12 sections, where a subplot grid +becomes unreadable. Both modes show the raw `_raw.dat` slice points as dots with +the fitted airfoil as a line. Pass `idxs` (e.g. `idxs=[1]`) to plot only those +airfoils by position; otherwise `symmetric=true` shows just the first half of the +sections (the wing is mirror-symmetric, so the other half is redundant). +""" +function VortexStepMethod.plot_airfoils(geometry_file::String, + ::VortexStepMethod.MakieBackend; + overlay=nothing, symmetric::Bool=false, idxs=nothing, n_cols::Int=3, + is_show::Bool=true, is_save::Bool=false, save_path=nothing, + data_type::String=".png") + + airfoils = VortexStepMethod.airfoils_from_yaml(geometry_file) + isempty(airfoils) && error("No airfoils with a dat_file found in $geometry_file") + if idxs !== nothing + airfoils = airfoils[idxs] + elseif symmetric + airfoils = airfoils[1:cld(length(airfoils), 2)] + end + + n = length(airfoils) + use_overlay = overlay === nothing ? n > 12 : overlay + title = "Airfoils: $(basename(geometry_file))" + + if use_overlay + ids = [af.id for af in airfoils] + crange = (minimum(ids), maximum(ids)) + fig = Figure(size=(900, 600)) + ax = Axis(fig[1, 1]; title, xlabel="x/c", ylabel="y/c", aspect=DataAspect()) + for af in airfoils + isempty(af.x_raw) || scatter!(ax, af.x_raw, af.y_raw; + color=af.id, colorrange=crange, colormap=:viridis, markersize=3) + lines!(ax, af.x, af.y; color=af.id, colorrange=crange, colormap=:viridis) + end + Colorbar(fig[1, 2]; colormap=:viridis, limits=crange, label="section") + else + ncol = min(n_cols, n) + nrow = ceil(Int, n / ncol) + fig = Figure(size=(380 * ncol, 320 * nrow)) + Label(fig[0, :], title, fontsize=16) + for (i, af) in enumerate(airfoils) + ax = Axis(fig[div(i - 1, ncol) + 1, mod1(i, ncol)]; + title="Airfoil $(af.id)", xlabel="x/c", ylabel="y/c", + aspect=DataAspect()) + isempty(af.x_raw) || + scatter!(ax, af.x_raw, af.y_raw; color=(:gray, 0.5), markersize=4) + lines!(ax, af.x, af.y; color=:black) + end + end + + if is_save && !isnothing(save_path) + VortexStepMethod.save_plot(fig, save_path, "airfoils"; data_type) + end + is_show && display(fig) + return fig +end + +""" + plot_section_polars(body_aero, coefficient, ::MakieBackend; is_show=true, + is_save=false, save_path=nothing, data_type=".png") + +Makie backend implementation of [`plot_section_polars`](@ref). +""" +function VortexStepMethod.plot_section_polars(body_aero::BodyAerodynamics, + coefficient::Symbol, ::VortexStepMethod.MakieBackend; + is_show::Bool=true, is_save::Bool=false, + save_path=nothing, data_type::String=".png") + + coefficient in (:cl, :cd, :cm) || + throw(ArgumentError("coefficient must be :cl, :cd, or :cm, got :$coefficient")) + idx = coefficient === :cl ? 2 : coefficient === :cd ? 3 : 4 + label = uppercasefirst(string(coefficient)) + + fig = Figure(size=(900, 600)) + ax = Axis(fig[1, 1]; title="$label per section", xlabel="α [deg]", ylabel=label) + + n_sections = 0 + for wing in body_aero.wings + for (s, section) in enumerate(wing.unrefined_sections) + section.aero_model == POLAR_VECTORS || continue + aero = section.aero_data + aero === nothing && continue + lines!(ax, rad2deg.(aero[1]), aero[idx]; label="section $s") + n_sections += 1 + end + end + n_sections == 0 && error("No POLAR_VECTORS sections found in body") + n_sections <= 12 && axislegend(ax; position=:rt, framevisible=false) + + if is_save && !isnothing(save_path) + VortexStepMethod.save_plot(fig, save_path, "section_polars_$coefficient"; data_type) + end + is_show && display(fig) + return fig +end + end diff --git a/lib/AirfoilAero/Project.toml b/lib/AirfoilAero/Project.toml new file mode 100644 index 00000000..ca272b17 --- /dev/null +++ b/lib/AirfoilAero/Project.toml @@ -0,0 +1,33 @@ +name = "AirfoilAero" +uuid = "028acdb8-af45-4085-83da-edc09f4c5e4d" +authors = ["Bart van de Lint"] +version = "0.1.0" + +[deps] +Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +NPZ = "15e1cf62-19b3-5cfa-8e77-841668bca605" +Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a" +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +VortexStepMethod = "ed3cd733-9f0f-46a9-93e0-89b8d4998dd9" +Xfoil = "19641d66-a62d-11e8-2441-8f57a969a9c4" + +[sources] +VortexStepMethod = {path = "../.."} + +[compat] +Interpolations = "0.15, 0.16" +LinearAlgebra = "1" +NPZ = "0.4" +Parameters = "0.12" +Printf = "1" +Statistics = "1" +Xfoil = "1.1.0" +julia = "1.10, 1.11" + +[extras] +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[targets] +test = ["Test"] diff --git a/lib/AirfoilAero/data/nn-large.npz b/lib/AirfoilAero/data/nn-large.npz new file mode 100644 index 00000000..58817d3c Binary files /dev/null and b/lib/AirfoilAero/data/nn-large.npz differ diff --git a/lib/AirfoilAero/data/nn-medium.npz b/lib/AirfoilAero/data/nn-medium.npz new file mode 100644 index 00000000..9e5aa10c Binary files /dev/null and b/lib/AirfoilAero/data/nn-medium.npz differ diff --git a/lib/AirfoilAero/data/nn-small.npz b/lib/AirfoilAero/data/nn-small.npz new file mode 100644 index 00000000..8e28f1d6 Binary files /dev/null and b/lib/AirfoilAero/data/nn-small.npz differ diff --git a/lib/AirfoilAero/data/nn-xlarge.npz b/lib/AirfoilAero/data/nn-xlarge.npz new file mode 100644 index 00000000..def69359 Binary files /dev/null and b/lib/AirfoilAero/data/nn-xlarge.npz differ diff --git a/lib/AirfoilAero/data/nn-xsmall.npz b/lib/AirfoilAero/data/nn-xsmall.npz new file mode 100644 index 00000000..29a131a3 Binary files /dev/null and b/lib/AirfoilAero/data/nn-xsmall.npz differ diff --git a/lib/AirfoilAero/data/nn-xxlarge.npz b/lib/AirfoilAero/data/nn-xxlarge.npz new file mode 100644 index 00000000..f0eab992 Binary files /dev/null and b/lib/AirfoilAero/data/nn-xxlarge.npz differ diff --git a/lib/AirfoilAero/data/nn-xxsmall.npz b/lib/AirfoilAero/data/nn-xxsmall.npz new file mode 100644 index 00000000..d1f3dcf7 Binary files /dev/null and b/lib/AirfoilAero/data/nn-xxsmall.npz differ diff --git a/lib/AirfoilAero/data/nn-xxxlarge.npz b/lib/AirfoilAero/data/nn-xxxlarge.npz new file mode 100644 index 00000000..46b809f4 Binary files /dev/null and b/lib/AirfoilAero/data/nn-xxxlarge.npz differ diff --git a/lib/AirfoilAero/data/scaled_input_distribution.npz b/lib/AirfoilAero/data/scaled_input_distribution.npz new file mode 100644 index 00000000..3ffc8c39 Binary files /dev/null and b/lib/AirfoilAero/data/scaled_input_distribution.npz differ diff --git a/lib/AirfoilAero/src/AirfoilAero.jl b/lib/AirfoilAero/src/AirfoilAero.jl new file mode 100644 index 00000000..557db9b6 --- /dev/null +++ b/lib/AirfoilAero/src/AirfoilAero.jl @@ -0,0 +1,33 @@ +module AirfoilAero + +using LinearAlgebra +using Parameters +using Statistics +using Interpolations +using NPZ +using Xfoil +using Printf: @sprintf +using VortexStepMethod: CpData, CpPolar, interpolate_matrix_nans!, write_aero_matrix + +include("kulfan.jl") +include("neuralfoil.jl") +include("poly.jl") +include("airfoil_io.jl") +include("polar_gen.jl") +include("airfoil_solvers/common.jl") +include("airfoil_solvers/xfoil_solver.jl") +include("airfoil_solvers/neuralfoil_solver.jl") +include("cp_gen.jl") + +export KulfanParameters, KulfanFitMethod, LeastSquaresFit, EnvelopeFit +export fit_kulfan_parameters, kulfan_to_coordinates +export NeuralFoilModel, NeuralFoilResult, load_neuralfoil_model +export neuralfoil_aero, neuralfoil_section +export AbstractAirfoilSolver, XFoilSolver, NeuralFoilSolver +export SectionSolution, DeformedSection, deform_section, analyze_section, analyze_sweep +export create_polars, generate_cp_polar, lei_poly_coeffs +export turn_trailing_edge!, get_lower_upper +export read_dat_coordinates, write_dat, write_polar_csv +export generate_polar_from_coordinates, generate_polar_from_dat, resolve_airfoil + +end diff --git a/lib/AirfoilAero/src/airfoil_io.jl b/lib/AirfoilAero/src/airfoil_io.jl new file mode 100644 index 00000000..9e6fda17 --- /dev/null +++ b/lib/AirfoilAero/src/airfoil_io.jl @@ -0,0 +1,116 @@ +""" + read_dat_coordinates(path) -> (x, y) + +Read airfoil coordinates from a Selig-format `.dat` file, skipping header and +comment lines. +""" +function read_dat_coordinates(path::String) + x = Float64[] + y = Float64[] + for line in eachline(path) + s = strip(line) + (isempty(s) || !(isdigit(s[1]) || s[1] == '-' || s[1] == '.')) && continue + parts = split(s) + length(parts) >= 2 || continue + xp = tryparse(Float64, parts[1]) + yp = tryparse(Float64, parts[2]) + (xp === nothing || yp === nothing) && continue + push!(x, xp) + push!(y, yp) + end + return x, y +end + +""" + write_dat(filepath, name, x, y) -> filepath + +Write airfoil coordinates to a Selig-format `.dat` file. +""" +function write_dat(filepath::String, name::String, x::Vector, y::Vector) + open(filepath, "w") do io + println(io, name) + for i in eachindex(x) + println(io, @sprintf("%.8f %.8f", x[i], y[i])) + end + end + return filepath +end + +""" + write_polar_csv(filepath, result::NeuralFoilResult) + +Write a NeuralFoil result to a `POLAR_VECTORS` CSV (`alpha, Cd, Cs, Cl, Cm`). +""" +function write_polar_csv(filepath::String, result::NeuralFoilResult) + n = length(result.alpha) + open(filepath, "w") do io + println(io, "alpha,Cd,Cs,Cl,Cm") + for i in 1:n + row = (result.alpha[i], result.CD[i], 0.0, result.CL[i], result.CM[i]) + println(io, join((@sprintf("%.16g", v) for v in row), ",")) + end + end + return filepath +end + +""" + generate_polar_from_coordinates(x, y, output_path; Re, alpha_range=-180:1:180, kwargs...) + +Fit Kulfan parameters to `(x, y)`, evaluate NeuralFoil over `alpha_range` (degrees), +and write the polar CSV. Extra `kwargs` pass to [`neuralfoil_aero`](@ref). Returns +the `NeuralFoilResult`. +""" +function generate_polar_from_coordinates(x::Vector, y::Vector, output_path::String; + Re::Real, alpha_range=-180:1:180, kwargs...) + alphas = collect(Float64, alpha_range) + params = fit_kulfan_parameters(x, y) + result = neuralfoil_aero(params, alphas, Float64(Re); kwargs...) + write_polar_csv(output_path, result) + return result +end + +""" + resolve_airfoil(type, info, out_dir, id; Re, alpha_range) -> (new_type, new_info) + +Resolve one awesIO `wing_airfoils` entry to a core-loadable form. `breukels_regression` +`(t, kappa)` → `poly` coeffs (via [`lei_poly_coeffs`](@ref)); `neuralfoil` +`(dat_file_path, …)` → a `polars` CSV (via [`generate_polar_from_dat`](@ref)) written +under `out_dir`; `polars`/`poly`/`inviscid` pass through. `masure_regression` is not +yet supported. `info` file paths should already be absolute. +""" +function resolve_airfoil(type::AbstractString, info::AbstractDict, out_dir, id; + Re, alpha_range) + if type == "breukels_regression" + cl, cd, cm = lei_poly_coeffs(Float64(info["t"]), Float64(info["kappa"])) + return "poly", Dict{String,Any}("cl_coeffs" => cl, "cd_coeffs" => cd, + "cm_coeffs" => cm) + elseif type == "neuralfoil" + csv = joinpath(out_dir, "$(id).csv") + generate_polar_from_dat(String(info["dat_file_path"]), csv; Re, + alpha_range=collect(alpha_range), + model_size=String(get(info, "model_size", "large")), + n_crit=Float64(get(info, "n_crit", 9.0))) + return "polars", Dict{String,Any}("csv_file_path" => csv) + elseif type in ("polars", "poly", "inviscid") + return String(type), info + elseif type == "masure_regression" + error("masure_regression airfoils are not yet supported by AirfoilAero.") + else + error("Unknown airfoil type: $type") + end +end + +""" + generate_polar_from_dat(dat_path, output_path; Re, kwargs...) + +Read a `.dat` airfoil and generate its polar CSV via +[`generate_polar_from_coordinates`](@ref). This is AirfoilAero's `.dat` → CSV entry +point. +""" +function generate_polar_from_dat(dat_path::String, output_path::String; + Re::Real, kwargs...) + isfile(dat_path) || error("DAT file not found: $dat_path") + x, y = read_dat_coordinates(dat_path) + isempty(x) && error("No valid coordinates found in $dat_path") + return generate_polar_from_coordinates(x, y, output_path; Re, kwargs...) +end diff --git a/lib/AirfoilAero/src/airfoil_solvers/common.jl b/lib/AirfoilAero/src/airfoil_solvers/common.jl new file mode 100644 index 00000000..58579476 --- /dev/null +++ b/lib/AirfoilAero/src/airfoil_solvers/common.jl @@ -0,0 +1,109 @@ +""" + AbstractAirfoilSolver + +Supertype for a 2D-airfoil solver backend. Concrete subtypes ([`XFoilSolver`](@ref), +[`NeuralFoilSolver`](@ref)) select, by dispatch, how a deformed section is analysed. +Add a backend by subtyping this and defining [`analyze_section`](@ref) (and +optionally [`analyze_sweep`](@ref)); the deformation and Cp resampling are shared. +""" +abstract type AbstractAirfoilSolver end + +""" + SectionSolution + +Result of a single 2D analysis: integrated coefficients plus the surface pressure +as `(x/c, Cp)` per surface (each single-valued in x, leading edge to trailing +edge). `confidence` is `1.0`/`NaN` for XFoil (converged/not) or NeuralFoil's +`analysis_confidence`. The generator resamples the `(x, Cp)` pairs onto the shared +chord slices. +""" +struct SectionSolution + alpha::Float64 + cl::Float64 + cd::Float64 + cm::Float64 + confidence::Float64 + x_upper::Vector{Float64} + cp_upper::Vector{Float64} + x_lower::Vector{Float64} + cp_lower::Vector{Float64} +end + +""" + DeformedSection + +A section deformed by a trailing-edge deflection: the `EnvelopeFit` `kulfan` +parameters and their repaned coordinates `(x, y)`. NeuralFoil consumes `kulfan`, +XFoil consumes `(x, y)` — both describe the same shape. +""" +struct DeformedSection + kulfan::KulfanParameters + x::Vector{Float64} + y::Vector{Float64} +end + +""" + deform_section(base, delta; crease_frac=0.9, thickness_frac=1.0, + flip_thickness_neg=true, fit_method=EnvelopeFit(), + n_points=120) -> DeformedSection + +Deform a base airfoil (Kulfan parameters) by trailing-edge deflection `delta` +(radians) about the crease axis (`crease_frac` along chord, `thickness_frac` +through thickness — 1.0 = top surface), then refit with `fit_method` and repane. +The refit/repane produces a clean, even panel distribution for both backends. + +With `flip_thickness_neg` a negative `delta` mirrors the pivot through thickness +(`thickness_frac -> 1 - thickness_frac`): a soft membrane wing that folds about its +top surface for positive deflection rotates about its lower surface for negative. +""" +function deform_section(base::KulfanParameters, delta; + crease_frac=0.9, thickness_frac=1.0, flip_thickness_neg=true, + fit_method::KulfanFitMethod=EnvelopeFit(), n_points::Int=120) + if flip_thickness_neg && delta < 0 + thickness_frac = 1 - thickness_frac + end + x, y = kulfan_to_coordinates(base; n_points) + lower, upper = get_lower_upper(x, y, crease_frac) + turn_trailing_edge!(delta, x, y, lower, upper, crease_frac; thickness_frac) + kulfan = fit_kulfan_parameters(x, y, fit_method) + xr, yr = kulfan_to_coordinates(kulfan; n_points) + return DeformedSection(kulfan, xr, yr) +end + +""" + split_surfaces(x, cp) -> (x_upper, cp_upper, x_lower, cp_lower) + +Split a Selig-ordered `(x, cp)` node set at the leading edge (`argmin(x)`) into +upper and lower surfaces, each ordered leading edge → trailing edge (x increasing). +""" +function split_surfaces(x, cp) + le = argmin(x) + upper = le:-1:1 + lower = le:length(x) + return x[upper], cp[upper], x[lower], cp[lower] +end + +""" + resample_x(xs, values, targets) -> Vector{Float64} + +Linearly interpolate `values` (given at `xs`) onto `targets`, sorting by `x` and +dropping zero-length segments so the breakpoints are strictly increasing. +""" +function resample_x(xs, values, targets) + p = sortperm(xs) + xs, values = xs[p], values[p] + keep = [true; diff(xs) .> 0] + itp = linear_interpolation(xs[keep], values[keep]; extrapolation_bc=Line()) + return itp.(targets) +end + +""" + analyze_sweep(solver, def, alpha_range, Re) -> Vector{SectionSolution} + +Analyse a deformed section over `alpha_range` (radians). Generic fallback maps +[`analyze_section`](@ref); backends override for efficiency (XFoil reinit sweep, +NeuralFoil vectorization). +""" +function analyze_sweep(solver::AbstractAirfoilSolver, def::DeformedSection, alpha_range, Re) + return [analyze_section(solver, def, a, Re) for a in alpha_range] +end diff --git a/lib/AirfoilAero/src/airfoil_solvers/neuralfoil_solver.jl b/lib/AirfoilAero/src/airfoil_solvers/neuralfoil_solver.jl new file mode 100644 index 00000000..7eaf4e91 --- /dev/null +++ b/lib/AirfoilAero/src/airfoil_solvers/neuralfoil_solver.jl @@ -0,0 +1,45 @@ +""" + NeuralFoilSolver + +NeuralFoil backend. Evaluates the deformed section's Kulfan parameters through the +network (vectorized over angle) and reconstructs the surface pressure from the +predicted edge-velocity ratios. Fast, differentiable, and guarded by +`analysis_confidence` (carried into `SectionSolution.confidence`). + +# Fields +- `model_size`: network size (default "large"). +- `n_crit`: critical amplification factor (default 9.0). +- `xtr_upper`, `xtr_lower`: forced transition locations (default 1.0). +- `weights_dir`: override for the weights directory (default package data). +""" +@with_kw struct NeuralFoilSolver <: AbstractAirfoilSolver + model_size::String = "large" + n_crit::Float64 = 9.0 + xtr_upper::Float64 = 1.0 + xtr_lower::Float64 = 1.0 + weights_dir::Union{Nothing,String} = nothing +end + +""" + analyze_sweep(solver::NeuralFoilSolver, def, alpha_range, Re) -> Vector{SectionSolution} + +Evaluate all angles (radians) in one vectorized NeuralFoil call on the deformed +Kulfan parameters. Cp comes at NeuralFoil's fixed station x/c. +""" +function analyze_sweep(solver::NeuralFoilSolver, def::DeformedSection, alpha_range, Re) + res = neuralfoil_section(def.kulfan, rad2deg.(collect(alpha_range)), Re; + model_size=solver.model_size, weights_dir=solver.weights_dir, + n_crit=solver.n_crit, xtr_upper=solver.xtr_upper, xtr_lower=solver.xtr_lower) + return [SectionSolution(alpha_range[i], res.cl[i], res.cd[i], res.cm[i], + res.confidence[i], res.x, res.cp_upper[:, i], + res.x, res.cp_lower[:, i]) for i in eachindex(alpha_range)] +end + +""" + analyze_section(solver::NeuralFoilSolver, def, alpha, Re) -> SectionSolution + +Single-angle convenience; delegates to [`analyze_sweep`](@ref). +""" +function analyze_section(solver::NeuralFoilSolver, def::DeformedSection, alpha, Re) + return analyze_sweep(solver, def, [alpha], Re)[1] +end diff --git a/lib/AirfoilAero/src/airfoil_solvers/xfoil_solver.jl b/lib/AirfoilAero/src/airfoil_solvers/xfoil_solver.jl new file mode 100644 index 00000000..abfff7b1 --- /dev/null +++ b/lib/AirfoilAero/src/airfoil_solvers/xfoil_solver.jl @@ -0,0 +1,61 @@ +""" + XFoilSolver + +XFoil backend. Panels the (repaned) deformed coordinates and reads the pressure +distribution from `Xfoil.cpdump`. Defaults match NeuralFoil's training runs +(`xfoil_repanel` default paneling, `max_iter=100`, incompressible) so the two +backends are comparable. + +# Fields +- `npan`: XFoil panel count (default 160, XFoil's `PANE` default). +- `max_iter`: viscous iterations per angle (default 100). +- `xtrip`: forced transition `(upper, lower)` (default `(0.05, 0.05)`). +- `mach`: Mach number (default 0.0, incompressible). +""" +@with_kw struct XFoilSolver <: AbstractAirfoilSolver + npan::Int = 160 + max_iter::Int = 100 + xtrip::Tuple{Float64,Float64} = (0.05, 0.05) + mach::Float64 = 0.0 +end + +""" + analyze_sweep(solver::XFoilSolver, def, alpha_range, Re) -> Vector{SectionSolution} + +Set the deformed coordinates once, pane, then solve `alpha_range` (radians) +sweeping negative and positive angles outward from zero with a reinit at each side +for convergence. Non-converged angles yield empty Cp and `NaN` confidence. +""" +function analyze_sweep(solver::XFoilSolver, def::DeformedSection, alpha_range, Re) + Xfoil.set_coordinates(def.x, def.y) + Xfoil.pane(npan=solver.npan) + sols = Vector{SectionSolution}(undef, length(alpha_range)) + neg = sort(findall(<(0.0), alpha_range); rev=true) + pos = sort(findall(>=(0.0), alpha_range)) + for order in (neg, pos) + reinit = true + for ia in order + cl, cd, _, cm, converged = Xfoil.solve_alpha(rad2deg(alpha_range[ia]), Re; + iter=solver.max_iter, reinit=reinit, mach=solver.mach, xtrip=solver.xtrip) + reinit = false + if converged + xc, cp = Xfoil.cpdump() + xu, cu, xl, cl2 = split_surfaces(xc, cp) + sols[ia] = SectionSolution(alpha_range[ia], cl, cd, cm, 1.0, xu, cu, xl, cl2) + else + sols[ia] = SectionSolution(alpha_range[ia], NaN, NaN, NaN, NaN, + Float64[], Float64[], Float64[], Float64[]) + end + end + end + return sols +end + +""" + analyze_section(solver::XFoilSolver, def, alpha, Re) -> SectionSolution + +Single-angle convenience; delegates to [`analyze_sweep`](@ref). +""" +function analyze_section(solver::XFoilSolver, def::DeformedSection, alpha, Re) + return analyze_sweep(solver, def, [alpha], Re)[1] +end diff --git a/lib/AirfoilAero/src/cp_gen.jl b/lib/AirfoilAero/src/cp_gen.jl new file mode 100644 index 00000000..88759111 --- /dev/null +++ b/lib/AirfoilAero/src/cp_gen.jl @@ -0,0 +1,65 @@ +""" + generate_cp_polar(solver, base; alpha_range, delta_range, n_chord, + reynolds_number, crease_frac=0.9, thickness_frac=1.0, + flip_thickness_neg=true, remove_nan=true) -> CpPolar + +Build a chord-slice `Cp(alpha, delta)` table for a base airfoil (Kulfan +parameters) using the given [`AbstractAirfoilSolver`](@ref). For each `delta` the +section is deformed and refit ([`deform_section`](@ref)), analysed over +`alpha_range`, and each surface's `Cp(x/c)` resampled onto the `n_chord` chord +slices. Non-converged points stay `NaN` and, when `remove_nan`, are filled per +slice with [`interpolate_matrix_nans!`](@ref). `flip_thickness_neg` flips the +through-thickness pivot for negative `delta` (see [`deform_section`](@ref)). +""" +function generate_cp_polar(solver::AbstractAirfoilSolver, base::KulfanParameters; + alpha_range, delta_range, n_chord, reynolds_number, + crease_frac=0.9, thickness_frac=1.0, flip_thickness_neg=true, remove_nan=true) + chord_x = [(i - 0.5) / n_chord for i in 1:n_chord] + n_alpha, n_delta = length(alpha_range), length(delta_range) + cp_upper = fill(NaN, n_chord, n_alpha, n_delta) + cp_lower = fill(NaN, n_chord, n_alpha, n_delta) + + for (jd, delta) in enumerate(delta_range) + def = deform_section(base, delta; crease_frac, thickness_frac, + flip_thickness_neg) + sols = analyze_sweep(solver, def, alpha_range, reynolds_number) + for (ia, sol) in enumerate(sols) + isempty(sol.cp_upper) && continue + cp_upper[:, ia, jd] = resample_x(sol.x_upper, sol.cp_upper, chord_x) + cp_lower[:, ia, jd] = resample_x(sol.x_lower, sol.cp_lower, chord_x) + end + end + + if remove_nan + fill_slice_nans!(cp_upper) + fill_slice_nans!(cp_lower) + end + data = CpData(n_chord, chord_x, collect(float.(alpha_range)), + collect(float.(delta_range)), cp_upper, cp_lower) + return CpPolar(data) +end + +""" + generate_cp_polar(solver, x::Vector, y::Vector; kwargs...) -> CpPolar + +Convenience: fit base Kulfan parameters from coordinates (via `EnvelopeFit`) first. +""" +function generate_cp_polar(solver::AbstractAirfoilSolver, x::Vector, y::Vector; kwargs...) + return generate_cp_polar(solver, fit_kulfan_parameters(x, y, EnvelopeFit()); kwargs...) +end + +""" + fill_slice_nans!(grid) + +Fill `NaN`s in each chord slice's `(alpha, delta)` matrix with +[`interpolate_matrix_nans!`](@ref); all-`NaN` slices are left untouched. +""" +function fill_slice_nans!(grid) + for i in axes(grid, 1) + slice = grid[i, :, :] + all(isnan, slice) && continue + interpolate_matrix_nans!(slice; prn=false) + grid[i, :, :] = slice + end + return nothing +end diff --git a/lib/AirfoilAero/src/kulfan.jl b/lib/AirfoilAero/src/kulfan.jl new file mode 100644 index 00000000..77a0ab0c --- /dev/null +++ b/lib/AirfoilAero/src/kulfan.jl @@ -0,0 +1,355 @@ +""" +Kulfan CST (Class Shape Transformation) airfoil parameterization. + +This module provides functions to: +- Fit Kulfan parameters from airfoil coordinates +- Generate airfoil coordinates from Kulfan parameters +""" + +""" + KulfanParameters + +Kulfan CST parameters for an airfoil. + +# Fields +- `upper_weights::Vector{Float64}`: 8 weights for upper surface +- `lower_weights::Vector{Float64}`: 8 weights for lower surface +- `leading_edge_weight::Float64`: Leading edge modification weight +- `TE_thickness::Float64`: Trailing edge thickness +""" +struct KulfanParameters + upper_weights::Vector{Float64} + lower_weights::Vector{Float64} + leading_edge_weight::Float64 + TE_thickness::Float64 +end + +""" + KulfanFitMethod + +Abstract supertype for Kulfan-parameter fitting strategies. Concrete methods +[`LeastSquaresFit`](@ref) and [`EnvelopeFit`](@ref) are passed to +[`fit_kulfan_parameters`](@ref), which dispatches on them. +""" +abstract type KulfanFitMethod end + +""" + LeastSquaresFit(; n_weights=8) + +Least-squares Kulfan fit: solves a single system that fits both surfaces +*through* the points, matching AeroSandbox's `get_kulfan_parameters` (the +parameterization NeuralFoil was trained on). Sensitive to noisy interior points; +use [`EnvelopeFit`](@ref) for those. +""" +@with_kw struct LeastSquaresFit <: KulfanFitMethod + n_weights::Int = 8 +end + +""" + EnvelopeFit(; min_distance=0.0, n_weights=8, tightness=1.0, + perimeter_weight=1.0, penalty=1e4, n_grid=80, n_iter=30, + regularization=1e-6, tol=1e-10) + +Enclosing Kulfan fit: wraps the airfoil tightly *around* the point cloud, +keeping every point at least `min_distance` inside the surfaces. Robust to noisy +interior points (e.g. the internal structure of a ram-air kite slice) that pull +[`LeastSquaresFit`](@ref) inward. See [`fit_kulfan_parameters`](@ref) for the +method and algorithm. + +Two knobs trade off the fit: +- `tightness` pulls the surfaces onto the outermost points (minimises enclosed + area); raise it to follow concave detail more closely. +- `perimeter_weight` minimises the surfaces' arc length (a shrink-wrap); raise it + for a smoother, shorter perimeter at the cost of some tightness. + +# Fields +- `min_distance`: required clearance between each surface and the points +- `n_weights`: weights per surface (NeuralFoil uses 8) +- `tightness`: weight of the enclosed-area objective (hug the points) +- `perimeter_weight`: weight of the arc-length objective (smooth, short perimeter) +- `penalty`: weight of each active clearance-constraint row +- `n_grid`: number of chordwise stations used to measure perimeter +- `n_iter`, `tol`: active-set / reweighting iteration controls +- `regularization`: Tikhonov weight toward the least-squares fit +""" +@with_kw struct EnvelopeFit <: KulfanFitMethod + min_distance::Float64 = 0.0 + n_weights::Int = 8 + tightness::Float64 = 1.0 + perimeter_weight::Float64 = 1.0 + penalty::Float64 = 1e4 + n_grid::Int = 80 + n_iter::Int = 30 + regularization::Float64 = 1e-6 + tol::Float64 = 1e-10 +end + +""" + bernstein_basis(x::AbstractVector, n::Int) + +Compute Bernstein polynomial basis matrix. + +Returns matrix of shape (length(x), n+1) where each column is a Bernstein polynomial +B_i(x) = binomial(n,i) * x^i * (1-x)^(n-i) +""" +function bernstein_basis(x::AbstractVector{T}, n::Int) where T + m = length(x) + B = zeros(T, m, n + 1) + for i in 0:n + coeff = binomial(n, i) + @. B[:, i+1] = coeff * x^i * (1 - x)^(n - i) + end + return B +end + +""" + class_function(x; N1=0.5, N2=1.0) + +CST class function for airfoils: C(x) = x^N1 * (1-x)^N2 + +Standard values N1=0.5, N2=1.0 give round leading edge and pointed trailing edge. +""" +function class_function(x::AbstractVector{T}; N1=0.5, N2=1.0) where T + # Avoid numerical issues at endpoints + x_safe = clamp.(x, eps(T), 1 - eps(T)) + return x_safe.^N1 .* (1 .- x_safe).^N2 +end + +""" + normalize_airfoil(x::Vector, y::Vector) + +Normalize airfoil coordinates to unit chord with LE at origin. + +Returns normalized (x, y) and transformation parameters. +""" +function normalize_airfoil(x::Vector{T}, y::Vector{T}) where T + # Find leading edge (minimum x) + le_idx = argmin(x) + x_le, y_le = x[le_idx], y[le_idx] + + # Find trailing edge (maximum x) + te_idx = argmax(x) + x_te, y_te = x[te_idx], y[te_idx] + + # Chord length and angle + chord = sqrt((x_te - x_le)^2 + (y_te - y_le)^2) + angle = atan(y_te - y_le, x_te - x_le) + + # Transform: translate to LE at origin, rotate, scale + x_norm = similar(x) + y_norm = similar(y) + cos_a, sin_a = cos(angle), sin(angle) + + for i in eachindex(x) + dx = x[i] - x_le + dy = y[i] - y_le + x_rot = cos_a * dx + sin_a * dy + y_rot = -sin_a * dx + cos_a * dy + x_norm[i] = x_rot / chord + y_norm[i] = y_rot / chord + end + + return x_norm, y_norm, (x_le=x_le, y_le=y_le, chord=chord, angle=angle) +end + +""" + leading_edge_basis(x::AbstractVector, n_weights::Int) + +Leading-edge-modification basis used by AeroSandbox/NeuralFoil: +`x * (1 - x)^(n_weights + 0.5)`. Added identically to both surfaces. +""" +function leading_edge_basis(x::AbstractVector{T}, n_weights::Int) where T + return x .* max.(1 .- x, zero(T)).^(n_weights + 0.5) +end + +""" + fit_kulfan_parameters(x::Vector, y::Vector, method::KulfanFitMethod) + fit_kulfan_parameters(x::Vector, y::Vector; n_weights=8) + +Fit Kulfan CST parameters to airfoil coordinates. The `method` selects the +strategy: [`LeastSquaresFit`](@ref) fits *through* the points (default), while +[`EnvelopeFit`](@ref) wraps tightly *around* them and is robust to noisy interior +points. The keyword form is shorthand for `LeastSquaresFit(; n_weights)`. + +Input coordinates are assumed to be in Selig order (TE upper -> LE -> TE lower). + +# Returns +- `KulfanParameters`: Fitted parameters +""" +function fit_kulfan_parameters(x::Vector{T}, y::Vector{T}; n_weights::Int=8) where T + return fit_kulfan_parameters(x, y, LeastSquaresFit(; n_weights)) +end + +""" + fit_kulfan_parameters(x, y, method::LeastSquaresFit) + +Least-squares fit matching AeroSandbox's `get_kulfan_parameters`: both surfaces +share a single least-squares system with a shared leading-edge weight and a +trailing-edge thickness. +""" +function fit_kulfan_parameters(x::Vector{T}, y::Vector{T}, + method::LeastSquaresFit) where T + n_weights = method.n_weights + x_norm, y_norm, _ = normalize_airfoil(x, y) + xv = clamp.(x_norm, zero(T), one(T)) + + le_idx = argmin(xv) + is_upper = (1:length(xv)) .<= le_idx + + CS = class_function(xv) .* bernstein_basis(xv, n_weights - 1) + le_col = leading_edge_basis(xv, n_weights) + te_col = ifelse.(is_upper, xv ./ 2, .-xv ./ 2) + + A = hcat((.!is_upper) .* CS, is_upper .* CS, le_col, te_col) + coeffs = A \ y_norm + TE_thickness = coeffs[end] + + if TE_thickness < 0 + A = hcat((.!is_upper) .* CS, is_upper .* CS, le_col) + coeffs = A \ y_norm + TE_thickness = zero(T) + end + + lower_weights = coeffs[1:n_weights] + upper_weights = coeffs[n_weights+1:2n_weights] + leading_edge_weight = coeffs[2n_weights+1] + + return KulfanParameters(upper_weights, lower_weights, leading_edge_weight, + TE_thickness) +end + +""" + fit_kulfan_parameters(x, y, method::EnvelopeFit) + +Fit Kulfan CST parameters so the airfoil *encloses* the point cloud `(x, y)` as +tightly as possible while keeping every point at least `method.min_distance` +inside the surfaces. + +Unlike [`LeastSquaresFit`](@ref), which fits *through* the points and is pulled +around by noisy interior points (e.g. the internal structure of a ram-air kite +slice), this fits a tight outer envelope: the upper surface stays above every +point and the lower surface below it, so only the outermost points are active and +interior points are ignored. For flat/thin sections where the surfaces nearly +coincide, `min_distance` sets the minimum clearance between each surface and the +points, preventing the envelope from collapsing to zero thickness. The leading and +trailing edges are pinned at the extreme points (the CST class function ties both +surfaces to the chord there), so the clearance applies between the points and the +upper/lower surfaces, not chordwise at the nose and tail. + +It approximates the program "minimise `tightness`·(enclosed area) + +`perimeter_weight`·(surface arc length) subject to +`upper(xᵢ) ≥ yᵢ + min_distance` and `lower(xᵢ) ≤ yᵢ - min_distance`" by an +iteratively reweighted active-set least-squares. Each iteration solves one +stacked least-squares (QR via `\\`) of four blocks: a squared-thickness objective +(`tightness`), a penalty row per currently-violated clearance constraint +(`penalty`), arc-length rows over an `n_grid`-station chordwise grid whose +segments are reweighted by inverse length each iteration so the quadratic descends +the true perimeter (`perimeter_weight`), and a Tikhonov term toward the +least-squares fit (`regularization`). Because the objective is area and perimeter +rather than distance to each point, interior points exert no inward pull, the +perimeter term keeps the surfaces smooth without a non-representable uniform +offset, and the method degrades gracefully when `min_distance` is too large for +the section to satisfy. + +# Returns +- `KulfanParameters`: fitted parameters +""" +function fit_kulfan_parameters(x::Vector{T}, y::Vector{T}, + method::EnvelopeFit) where T + n_weights = method.n_weights + d = T(method.min_distance) + x_norm, y_norm, _ = normalize_airfoil(x, y) + xv = clamp.(x_norm, zero(T), one(T)) + m = length(xv) + n_params = 2n_weights + 2 + + surface_design(xs) = begin + cs = class_function(xs) .* bernstein_basis(xs, n_weights - 1) + leb = leading_edge_basis(xs, n_weights) + half = xs ./ 2 + zb = zeros(T, length(xs), n_weights) + upper = hcat(zb, cs, leb, half) + lower = hcat(cs, zb, leb, .-half) + return upper, lower + end + + upper_pts, lower_pts = surface_design(xv) + A = vcat(upper_pts, .-lower_pts) + b = vcat(y_norm .+ d, d .- y_norm) + + thickness_rows = sqrt(T(method.tightness)) .* (upper_pts .- lower_pts) + thickness_rhs = zeros(T, m) + + grid = (one(T) .- cos.(range(zero(T), T(pi), method.n_grid))) ./ 2 + upper_grid, lower_grid = surface_design(grid) + diff_upper = upper_grid[2:end, :] .- upper_grid[1:end-1, :] + diff_lower = lower_grid[2:end, :] .- lower_grid[1:end-1, :] + perimeter_rows = vcat(diff_upper, diff_lower) + dx2 = repeat((grid[2:end] .- grid[1:end-1]) .^ 2, 2) + + reg_rows = sqrt(T(method.regularization)) .* Matrix{T}(I, n_params, n_params) + p0 = fit_kulfan_parameters(x, y; n_weights) + theta0 = vcat(p0.lower_weights, p0.upper_weights, p0.leading_edge_weight, + p0.TE_thickness) + reg_rhs = sqrt(T(method.regularization)) .* theta0 + + theta = copy(theta0) + for _ in 1:method.n_iter + clearance_weight = sqrt.(T(method.penalty) .* ((A * theta .- b) .< 0)) + segment_length = sqrt.(dx2 .+ (perimeter_rows * theta) .^ 2) + perimeter_weight = sqrt.(T(method.perimeter_weight) ./ segment_length) + M = vcat(thickness_rows, clearance_weight .* A, + perimeter_weight .* perimeter_rows, reg_rows) + rhs = vcat(thickness_rhs, clearance_weight .* b, + zeros(T, length(perimeter_weight)), reg_rhs) + theta_new = M \ rhs + converged = maximum(abs.(theta_new .- theta)) < T(method.tol) + theta = theta_new + converged && break + end + + lower_weights = theta[1:n_weights] + upper_weights = theta[n_weights+1:2n_weights] + leading_edge_weight = theta[2n_weights+1] + TE_thickness = max(theta[2n_weights+2], zero(T)) + + return KulfanParameters(upper_weights, lower_weights, leading_edge_weight, + TE_thickness) +end + +""" + kulfan_to_coordinates(params::KulfanParameters; n_points=100) + +Generate airfoil coordinates from Kulfan parameters. + +Returns (x, y) coordinates in Selig format (TE upper -> LE -> TE lower). +""" +function kulfan_to_coordinates(params::KulfanParameters; n_points::Int=100) + # Cosine spacing for better LE resolution + theta = range(0, pi, n_points) + x = @. (1 - cos(theta)) / 2 + + n_upper = length(params.upper_weights) + n_lower = length(params.lower_weights) + + C = class_function(x) + B_upper = bernstein_basis(x, n_upper - 1) + B_lower = bernstein_basis(x, n_lower - 1) + + # Shape functions + S_upper = B_upper * params.upper_weights + S_lower = B_lower * params.lower_weights + + # Leading-edge modification (shared, added to both surfaces) + le = params.leading_edge_weight .* leading_edge_basis(x, n_upper) + + # y coordinates + y_upper = C .* S_upper .+ le .+ x .* (params.TE_thickness / 2) + y_lower = C .* S_lower .+ le .- x .* (params.TE_thickness / 2) + + # Combine in Selig format + x_coords = vcat(reverse(x), x[2:end]) + y_coords = vcat(reverse(y_upper), y_lower[2:end]) + + return x_coords, y_coords +end diff --git a/lib/AirfoilAero/src/neuralfoil.jl b/lib/AirfoilAero/src/neuralfoil.jl new file mode 100644 index 00000000..1b616be9 --- /dev/null +++ b/lib/AirfoilAero/src/neuralfoil.jl @@ -0,0 +1,398 @@ +""" +NeuralFoil - Pure Julia implementation of the NeuralFoil neural network for airfoil +aerodynamics prediction. + +Based on: https://github.com/peterdsharpe/NeuralFoil + +This module loads the pre-trained neural network weights and provides functions to +evaluate airfoil aerodynamics from Kulfan CST parameters. +""" + +using NPZ + +# Path to NeuralFoil weights (relative to this package) +const NEURALFOIL_WEIGHTS_DIR = joinpath(@__DIR__, "..", "data") + +# Global cache for loaded weights +const _NN_CACHE = Dict{String, Any}() + +""" + NeuralFoilModel + +Holds the neural network weights and configuration. +""" +struct NeuralFoilModel + weights::Vector{Matrix{Float32}} + biases::Vector{Vector{Float32}} + layer_indices::Vector{Int} + mean_inputs::Vector{Float32} + inv_cov_inputs::Matrix{Float64} + n_inputs::Int +end + +""" + swish(x) + +SiLU/Swish activation function: x * sigmoid(x) = x / (1 + exp(-x)) +""" +function swish(x::T) where T + return x / (one(T) + exp(-x)) +end + +function swish(x::AbstractArray) + return x ./ (one(eltype(x)) .+ exp.(-x)) +end + +""" + sigmoid(x) + +Sigmoid activation function. +""" +function sigmoid(x::T) where T + x_clipped = clamp(x, T(-500), T(500)) + return one(T) / (one(T) + exp(-x_clipped)) +end + +""" + load_neuralfoil_model(model_size::String="xlarge"; weights_dir=nothing) + +Load NeuralFoil neural network weights from .npz files. + +# Arguments +- `model_size`: One of "xxsmall", "xsmall", "small", "medium", "large", + "xlarge", "xxlarge", "xxxlarge" +- `weights_dir`: Directory containing the .npz files (defaults to package data dir) + +# Returns +- `NeuralFoilModel`: Loaded model ready for evaluation +""" +function load_neuralfoil_model(model_size::String="xlarge"; weights_dir=nothing) + # Check cache + cache_key = "$(model_size)_$(weights_dir)" + if haskey(_NN_CACHE, cache_key) + return _NN_CACHE[cache_key] + end + + if weights_dir === nothing + weights_dir = NEURALFOIL_WEIGHTS_DIR + end + + # Load neural network weights + nn_path = joinpath(weights_dir, "nn-$(model_size).npz") + if !isfile(nn_path) + error("NeuralFoil weights not found at $nn_path. " * + "Copy weights from NeuralFoil package.") + end + + nn_data = npzread(nn_path) + + # Parse layer indices from keys like "net.0.weight", "net.2.weight", etc. + layer_indices = Int[] + for key in keys(nn_data) + m = match(r"net\.(\d+)\.weight", key) + if m !== nothing + push!(layer_indices, parse(Int, m.captures[1])) + end + end + sort!(unique!(layer_indices)) + + # Load weights and biases in order + weights = Matrix{Float32}[] + biases = Vector{Float32}[] + for idx in layer_indices + push!(weights, Float32.(nn_data["net.$(idx).weight"])) + push!(biases, Float32.(vec(nn_data["net.$(idx).bias"]))) + end + + # Load input distribution statistics + dist_path = joinpath(weights_dir, "scaled_input_distribution.npz") + if !isfile(dist_path) + error("Input distribution file not found at $dist_path") + end + + dist_data = npzread(dist_path) + mean_inputs = Float32.(vec(dist_data["mean_inputs_scaled"])) + inv_cov_inputs = Float64.(dist_data["inv_cov_inputs_scaled"]) + + model = NeuralFoilModel(weights, biases, layer_indices, mean_inputs, + inv_cov_inputs, length(mean_inputs)) + + _NN_CACHE[cache_key] = model + return model +end + +""" + nn_forward(x::AbstractMatrix, model::NeuralFoilModel) + +Forward pass through the neural network. + +# Arguments +- `x`: Input matrix of shape (n_inputs, n_cases) +- `model`: Loaded NeuralFoil model + +# Returns +- Output matrix of shape (n_outputs, n_cases) +""" +function nn_forward(x::AbstractMatrix{T}, model::NeuralFoilModel) where T + n_layers = length(model.weights) + + for i in 1:n_layers + x = model.weights[i] * x .+ model.biases[i] + if i < n_layers # No activation on last layer + x = swish(x) + end + end + + return x +end + +""" + squared_mahalanobis_distance(x::AbstractMatrix, model::NeuralFoilModel) + +Compute squared Mahalanobis distance from training distribution. + +This is used to penalize predictions far from the training data. +""" +function squared_mahalanobis_distance(x::AbstractMatrix, model::NeuralFoilModel) + n_cases = size(x, 2) + result = zeros(n_cases) + + for i in 1:n_cases + x_minus_mean = x[:, i] .- model.mean_inputs + result[i] = dot(x_minus_mean, model.inv_cov_inputs * x_minus_mean) + end + + return result +end + +""" + prepare_inputs(params::KulfanParameters, alpha, Re; + n_crit=9.0, xtr_upper=1.0, xtr_lower=1.0) + +Prepare neural network inputs from Kulfan parameters and flow conditions. + +# Arguments +- `params`: Kulfan CST parameters +- `alpha`: Angle of attack in degrees (scalar or vector) +- `Re`: Reynolds number (scalar or vector) +- `n_crit`: Critical amplification factor (default 9.0) +- `xtr_upper`: Forced transition location on upper surface (0-1) +- `xtr_lower`: Forced transition location on lower surface (0-1) + +# Returns +- Input matrix of shape (25, n_cases) +""" +function prepare_inputs(params::KulfanParameters, alpha, Re; + n_crit=9.0, xtr_upper=1.0, xtr_lower=1.0) + # Ensure vectors + alpha_vec = alpha isa Number ? [alpha] : collect(alpha) + Re_vec = Re isa Number ? fill(Re, length(alpha_vec)) : collect(Re) + n_cases = length(alpha_vec) + + # Broadcast other parameters + n_crit_vec = n_crit isa Number ? fill(n_crit, n_cases) : collect(n_crit) + xtr_upper_vec = xtr_upper isa Number ? fill(xtr_upper, n_cases) : collect(xtr_upper) + xtr_lower_vec = xtr_lower isa Number ? fill(xtr_lower, n_cases) : collect(xtr_lower) + + # Build input matrix (25 x n_cases) + x = zeros(Float32, 25, n_cases) + + # Kulfan parameters (same for all cases) + for i in 1:8 + x[i, :] .= params.upper_weights[i] + x[8+i, :] .= params.lower_weights[i] + end + x[17, :] .= params.leading_edge_weight + x[18, :] .= params.TE_thickness * 50 # Scale factor from NeuralFoil + + # Flow conditions (vary per case) + for i in 1:n_cases + a = alpha_vec[i] + x[19, i] = sind(2 * a) + x[20, i] = cosd(a) + x[21, i] = 1 - cosd(a)^2 + x[22, i] = (log(Re_vec[i]) - 12.5) / 3.5 + x[23, i] = (n_crit_vec[i] - 9) / 4.5 + x[24, i] = xtr_upper_vec[i] + x[25, i] = xtr_lower_vec[i] + end + + return x +end + +""" + flip_inputs(x::AbstractMatrix) + +Flip inputs for symmetry embedding (swap upper/lower, negate alpha). +""" +function flip_inputs(x::AbstractMatrix{T}) where T + x_flip = copy(x) + + # Swap upper and lower weights with sign flip + x_flip[1:8, :] .= -x[9:16, :] # upper <- -lower + x_flip[9:16, :] .= -x[1:8, :] # lower <- -upper + + # Flip LE weight + x_flip[17, :] .= -x[17, :] + + # Flip sin(2*alpha) (index 19) + x_flip[19, :] .= -x[19, :] + + # Swap transition locations + x_flip[24, :] .= x[25, :] # xtr_upper <- xtr_lower + x_flip[25, :] .= x[24, :] # xtr_lower <- xtr_upper + + return x_flip +end + +""" + flip_outputs(y::AbstractMatrix) + +Flip outputs back after evaluating with flipped inputs. +""" +function flip_outputs(y::AbstractMatrix{T}) where T + y_flip = copy(y) + N = (size(y, 1) - 6) ÷ 6 + + # CL (row 2) and CM (row 4) flip sign + y_flip[2, :] .= -y[2, :] + y_flip[4, :] .= -y[4, :] + + # Transition locations swap (rows 5, 6) + y_flip[5, :] .= y[6, :] + y_flip[6, :] .= y[5, :] + + if N > 0 + # Swap upper/lower theta+H blocks (rows 7:6+2N ↔ 7+3N:6+5N) + y_flip[7:(6+2N), :] .= y[(7+3N):(6+5N), :] + y_flip[(7+3N):(6+5N), :] .= y[7:(6+2N), :] + # Swap upper/lower ue/vinf blocks with sign flip (velocity mirrors) + y_flip[(7+2N):(6+3N), :] .= -1 .* y[(7+5N):(6+6N), :] + y_flip[(7+5N):(6+6N), :] .= -1 .* y[(7+2N):(6+3N), :] + end + + return y_flip +end + +""" + compute_optimal_x_points(n) -> Vector{Float64} + +NeuralFoil's boundary-layer station x/c: midpoints of a uniform [0,1] grid. +""" +function compute_optimal_x_points(n) + s = range(0, 1, n + 1) + return [(s[i] + s[i+1]) / 2 for i in 1:n] +end + +""" + NeuralFoilResult + +Results from NeuralFoil aerodynamic analysis. +""" +struct NeuralFoilResult + alpha::Vector{Float64} + CL::Vector{Float64} + CD::Vector{Float64} + CM::Vector{Float64} + analysis_confidence::Vector{Float64} +end + +""" + neuralfoil_aero(params::KulfanParameters, alpha, Re; + model_size="xlarge", weights_dir=nothing, kwargs...) + +Compute aerodynamic coefficients using NeuralFoil. + +# Arguments +- `params`: Kulfan CST parameters +- `alpha`: Angle of attack in degrees (scalar or vector) +- `Re`: Reynolds number +- `model_size`: Neural network size (default "xlarge") +- `weights_dir`: Directory containing weight files + +# Keyword Arguments +- `n_crit`: Critical amplification factor (default 9.0) +- `xtr_upper`: Upper surface transition location (default 1.0) +- `xtr_lower`: Lower surface transition location (default 1.0) + +# Returns +- `NeuralFoilResult`: CL, CD, CM and analysis confidence +""" +function neuralfoil_aero(params::KulfanParameters, alpha, Re; + model_size::String="xlarge", weights_dir=nothing, + n_crit=9.0, xtr_upper=1.0, xtr_lower=1.0) + y = neuralfoil_fused_output(params, alpha, Re; model_size, weights_dir, + n_crit, xtr_upper, xtr_lower) + analysis_confidence = sigmoid.(y[1, :]) + CL = y[2, :] ./ 2 + CD = clamp.(exp.((y[3, :] .- 2) .* 2), 0.0, 1.0) + CM = y[4, :] ./ 20 + + alpha_vec = alpha isa Number ? [Float64(alpha)] : Float64.(collect(alpha)) + + return NeuralFoilResult(alpha_vec, Vector{Float64}(CL), Vector{Float64}(CD), + Vector{Float64}(CM), Vector{Float64}(analysis_confidence)) +end + +""" + neuralfoil_fused_output(params, alpha, Re; model_size, weights_dir, + n_crit, xtr_upper, xtr_lower) -> Matrix + +Forward pass with the symmetry embedding: evaluate the network, evaluate the +top/bottom-flipped case, flip its outputs back, and average. Returns the fused +output matrix (`n_outputs × n_cases`), with the Mahalanobis penalty already +applied to the confidence logit (row 1). +""" +function neuralfoil_fused_output(params::KulfanParameters, alpha, Re; + model_size::String="xlarge", weights_dir=nothing, + n_crit=9.0, xtr_upper=1.0, xtr_lower=1.0) + model = load_neuralfoil_model(model_size; weights_dir) + x = prepare_inputs(params, alpha, Re; n_crit, xtr_upper, xtr_lower) + y = nn_forward(x, model) + y[1, :] .-= squared_mahalanobis_distance(x, model) ./ (2 * model.n_inputs) + + x_flip = flip_inputs(x) + y_flip = nn_forward(x_flip, model) + y_flip[1, :] .-= squared_mahalanobis_distance(x_flip, model) ./ (2 * model.n_inputs) + + return (y .+ flip_outputs(y_flip)) ./ 2 +end + +""" + neuralfoil_section(params, alpha, Re; kwargs...) -> NamedTuple + +Full NeuralFoil evaluation returning integrated coefficients and the surface +pressure distribution reconstructed from the predicted edge-velocity ratios +(`Cp = 1 - (ue/vinf)^2`) at NeuralFoil's `N` fixed station x/c. + +Returns `(; alpha, cl, cd, cm, confidence, x, cp_upper, cp_lower)`, with `x` of +length `N` and `cp_upper`/`cp_lower` sized `N × n_alpha`. +""" +function neuralfoil_section(params::KulfanParameters, alpha, Re; + model_size::String="large", weights_dir=nothing, + n_crit=9.0, xtr_upper=1.0, xtr_lower=1.0) + y = neuralfoil_fused_output(params, alpha, Re; model_size, weights_dir, + n_crit, xtr_upper, xtr_lower) + N = (size(y, 1) - 6) ÷ 6 + upper_ue = y[(7 + 2N):(6 + 3N), :] + lower_ue = y[(7 + 5N):(6 + 6N), :] + alpha_vec = alpha isa Number ? [Float64(alpha)] : Float64.(collect(alpha)) + return (; alpha = alpha_vec, + cl = Vector{Float64}(y[2, :] ./ 2), + cd = Vector{Float64}(clamp.(exp.((y[3, :] .- 2) .* 2), 0.0, 1.0)), + cm = Vector{Float64}(y[4, :] ./ 20), + confidence = Vector{Float64}(sigmoid.(y[1, :])), + x = compute_optimal_x_points(N), + cp_upper = Matrix{Float64}(1 .- upper_ue .^ 2), + cp_lower = Matrix{Float64}(1 .- lower_ue .^ 2)) +end + +""" + neuralfoil_aero(x::Vector, y::Vector, alpha, Re; kwargs...) + +Convenience function that fits Kulfan parameters from coordinates first. +""" +function neuralfoil_aero(x::Vector, y::Vector, alpha, Re; kwargs...) + params = fit_kulfan_parameters(x, y) + return neuralfoil_aero(params, alpha, Re; kwargs...) +end diff --git a/lib/AirfoilAero/src/polar_gen.jl b/lib/AirfoilAero/src/polar_gen.jl new file mode 100644 index 00000000..fa189959 --- /dev/null +++ b/lib/AirfoilAero/src/polar_gen.jl @@ -0,0 +1,255 @@ + +const SPEED_OF_SOUND = 343 # [m/s] at 20 °C, see: https://en.wikipedia.org/wiki/Speed_of_sound +const KINEMATIC_VISCOSITY = 1.460e-5 # [m²/s] for the atmosphere at sea level. + # see: https://en.wikipedia.org/wiki/Reynolds_number + +""" + normalize_foil!(x, y) + +Scale airfoil coordinates to unit chord length, with x ∈ [0,1]. +""" +function normalize_foil!(x, y) + x_min = minimum(x) + x_max = maximum(x) + for i in eachindex(x) + x[i] = (x[i] - x_min) / (x_max - x_min) + y[i] = (y[i] - x_min) / (x_max - x_min) + end +end + +""" + turn_trailing_edge!(angle, x, y, lower_turn, upper_turn, crease_frac; thickness_frac=nothing) + +Deflect airfoil trailing edge by rotating coordinates behind the crease line. +Positive angle deflects downward. + +The pivot's through-thickness location is set by `thickness_frac` (0 = bottom +surface, 0.5 = mid, 1 = top): `y_pivot = lower_turn + thickness_frac*(upper_turn - +lower_turn)`. When `thickness_frac` is given, points are only rotated (no crease +cleanup) — intended for a following Kulfan refit that wraps the crease robustly. +When `thickness_frac === nothing` (legacy), the pivot is the top surface for +downward deflection and the bottom for upward, and folded-over crease points are +removed and the band averaged so the coordinates stay XFoil-paneable. +""" +function turn_trailing_edge!(angle, x, y, lower_turn, upper_turn, crease_frac; + thickness_frac=nothing) + legacy = thickness_frac === nothing + turn_distance = upper_turn - lower_turn + flap_sign = angle > 0 ? 1 : -1 + y_turn = legacy ? (angle > 0 ? upper_turn : lower_turn) : + lower_turn + thickness_frac * turn_distance + smooth_idx = Int[] + rm_idx = Int[] + for i in eachindex(x) + if legacy + if crease_frac - turn_distance < x[i] < crease_frac + turn_distance && + flap_sign * y[i] > 0 + push!(smooth_idx, i) + elseif flap_sign * y[i] < 0 && crease_frac > x[i] > crease_frac - turn_distance + push!(rm_idx, i) + end + end + if x[i] > crease_frac + x_rel = x[i] - crease_frac + y_rel = y[i] - y_turn + x[i] = crease_frac + x_rel * cos(angle) + y_rel * sin(angle) + y[i] = y_turn - x_rel * sin(angle) + y_rel * cos(angle) + if legacy && angle > 0 && x[i] < crease_frac - turn_distance/2 && y[i] > lower_turn + push!(rm_idx, i) + elseif legacy && angle < 0 && x[i] < crease_frac - turn_distance/2 && + y[i] < upper_turn + push!(rm_idx, i) + end + end + end + + legacy || return nothing + lower_i, upper_i = minimum(smooth_idx), maximum(smooth_idx) + for i in smooth_idx + window = min(i - lower_i + 1, upper_i - i + 1) + x[i] = mean(x[i-window:i+window]) + end + deleteat!(x, rm_idx) + deleteat!(y, rm_idx) + nothing +end + +""" + solve_alpha!(cls, cds, cms, alpha_range, alpha_idxs, delta, re, x_, y_, + lower, upper, kite_speed, speed_of_sound, crease_frac) + +Calculate aerodynamic coefficients for specified angles of attack using XFoil. +Results are stored in pre-allocated cls, cds, cms vectors. +""" +function solve_alpha!(cls, cds, cms, alpha_range, alpha_idxs, delta, re, x_, y_, lower, upper, kite_speed, speed_of_sound, crease_frac) + x = deepcopy(x_) + y = deepcopy(y_) + turn_trailing_edge!(delta, x, y, lower, upper, crease_frac) + Xfoil.set_coordinates(x, y) + Xfoil.pane(npan=140) + reinit = true + for (alpha, alpha_idx) in zip(alpha_range, alpha_idxs) + # Solve for the given angle of attack + cl, cd, _, cm, converged = Xfoil.solve_alpha(rad2deg(alpha), re; iter=50, reinit=reinit, mach=kite_speed/speed_of_sound, xtrip=(0.05, 0.05)) + reinit = false + if converged + cls[alpha_idx] = cl + cds[alpha_idx] = cd + cms[alpha_idx] = cm + end + end + return nothing +end + +""" + run_solve_alpha(alpha_range, delta, re, x_, y_, lower, upper, kite_speed, + speed_of_sound, crease_frac) -> (cls, cds, cms) + +Run XFoil analysis for full alpha range, handling positive and negative angles separately. +""" +function run_solve_alpha(alpha_range, delta, re, x_, y_, lower, upper, kite_speed, speed_of_sound, crease_frac) + @info "solving alpha with trailing edge angle: $(rad2deg(delta)) degrees" + cls = Float64[NaN for _ in alpha_range] + cds = Float64[NaN for _ in alpha_range] + cms = Float64[NaN for _ in alpha_range] + neg_idxs = sort(findall(alpha_range .< 0.0), rev=true) + neg_alpha_range = alpha_range[neg_idxs] + pos_idxs = sort(findall(alpha_range .>= 0.0)) + pos_alpha_range = alpha_range[pos_idxs] + + solve_alpha!(cls, cds, cms, neg_alpha_range, neg_idxs, delta, + re, x_, y_, lower, upper, kite_speed, speed_of_sound, crease_frac) + solve_alpha!(cls, cds, cms, pos_alpha_range, pos_idxs, delta, + re, x_, y_, lower, upper, kite_speed, speed_of_sound, crease_frac) + return cls, cds, cms +end + +""" + get_lower_upper(x, y, crease_frac) -> (lower, upper) + +Find y-coordinates where upper/lower surfaces intersect the hinge line. +""" +function get_lower_upper(x, y, crease_frac) + lower_trailing_edge = 0.0 + upper_trailing_edge = 0.0 + min_lower_distance = Inf + min_upper_distance = Inf + for (xi, yi) in zip(x, y) + if yi < 0 + lower_distance = abs(xi - crease_frac) + if lower_distance < min_lower_distance + min_lower_distance = lower_distance + lower_trailing_edge = yi + end + else + upper_distance = abs(xi - crease_frac) + if upper_distance < min_upper_distance + min_upper_distance = upper_distance + upper_trailing_edge = yi + end + end + end + return lower_trailing_edge, upper_trailing_edge +end + +""" + create_polars(; dat_path, cl_polar_path, cd_polar_path, cm_polar_path, wind_vel, area, + width, crease_frac, alpha_range, delta_range, remove_nan=true) + +Generate complete aerodynamic coefficient tables for an airfoil with trailing edge deflection. + +This function: +1. Reads airfoil coordinates from a .dat file +2. Normalizes the coordinates to unit chord +3. Computes Reynolds number based on normal flight conditions +4. Generates coefficient matrices using XFoil for combinations of: + - Angles of attack (alpha_range) + - Trailing edge deflections (delta_range) +5. Optionally interpolates any NaN values from failed computations +6. Saves results to CSV files + +# Arguments +- `dat_path`: Path to airfoil coordinate file +- `cl_polar_path`: Output path for lift coefficient CSV +- `cd_polar_path`: Output path for drag coefficient CSV +- `cm_polar_path`: Output path for moment coefficient CSV +- `wind_vel`: Reference velocity (m/s) +- `area`: Wing area (m²) +- `width`: Wing span (m) +- `crease_frac`: Chordwise location of hinge line (0-1) +- `alpha_range`: Vector of angles of attack to analyze (radians) +- `delta_range`: Vector of trailing edge deflections to analyze (radians) +- `remove_nan`: Whether to interpolate NaN values in results (default: true) + +# Outputs +Creates three CSV files containing lift, drag, and moment coefficient matrices. +Each file includes headers with angle labels and uses degrees for readability. +""" +function create_polars(; dat_path, cl_polar_path, cd_polar_path, cm_polar_path, wind_vel, area, + width, crease_frac, alpha_range, delta_range, remove_nan=true +) + @info "Creating polars. This can take several minutes." + + cl_matrix = zeros(length(alpha_range), length(delta_range)) + cd_matrix = zeros(length(alpha_range), length(delta_range)) + cm_matrix = zeros(length(alpha_range), length(delta_range)) + + kite_speed = wind_vel + chord_length = area / width + local reynolds_number = kite_speed * chord_length / KINEMATIC_VISCOSITY # https://en.wikipedia.org/wiki/Reynolds_number + + # Read airfoil coordinates from a file. + local x = Float64[] + local y = Float64[] + f = open(dat_path, "r") + try + for line in eachline(f) + entries = split(chomp(line)) + try + push!(x, parse(Float64, entries[1])) + push!(y, parse(Float64, entries[2])) + catch err + if err isa ArgumentError + println(entries) + else + rethrow(err) + end + end + end + finally + close(f) + end + normalize_foil!(x, y) + Xfoil.set_coordinates(x, y) + x, y = Xfoil.pane(npan=140) + lower, upper = get_lower_upper(x, y, crease_frac) + + for j in eachindex(delta_range) + cl_matrix[:, j], cd_matrix[:, j], cm_matrix[:, j] = run_solve_alpha(alpha_range, delta_range[j], + reynolds_number, x, y, lower, upper, kite_speed, SPEED_OF_SOUND, crease_frac) + end + cl_matrix = Matrix{Float64}(cl_matrix) + cd_matrix = Matrix{Float64}(cd_matrix) + cm_matrix = Matrix{Float64}(cm_matrix) + + println("Generated lift matrix:") + display(cl_matrix) + println("Generated drag matrix:") + display(cd_matrix) + println("Generated moment matrix:") + display(cm_matrix) + + @info "Relative trailing_edge height: $(upper - lower)" + @info "Reynolds number for flying speed of $kite_speed is $reynolds_number" + + if remove_nan + interpolate_matrix_nans!(cl_matrix) + interpolate_matrix_nans!(cd_matrix) + interpolate_matrix_nans!(cm_matrix) + end + + write_aero_matrix(cl_polar_path, cl_matrix, alpha_range, delta_range, "C_l") + write_aero_matrix(cd_polar_path, cd_matrix, alpha_range, delta_range, "C_d") + write_aero_matrix(cm_polar_path, cm_matrix, alpha_range, delta_range, "C_m") + return nothing +end diff --git a/lib/AirfoilAero/src/poly.jl b/lib/AirfoilAero/src/poly.jl new file mode 100644 index 00000000..2e1a81ff --- /dev/null +++ b/lib/AirfoilAero/src/poly.jl @@ -0,0 +1,54 @@ +""" + lei_poly_coeffs(tube_diameter, camber) -> (cl_coeffs, cd_coeffs, cm_coeffs) + +Breukels leading-edge-inflatable α-polynomial coefficients (α in **degrees**) for a +section with normalized `tube_diameter` and `camber`. `cl_coeffs` is a cubic (4 +coefficients, ascending order), `cd_coeffs`/`cm_coeffs` are quadratic (3). Feed the +result to a core `POLY` section as `aero_data = (cl_coeffs, cd_coeffs, cm_coeffs)`. +""" +function lei_poly_coeffs(tube_diameter, camber) + t = tube_diameter + k = camber + C = Dict( + 20 => -0.008011, 21 => -0.000336, 22 => 0.000992, + 23 => 0.013936, 24 => -0.003838, 25 => -0.000161, + 26 => 0.001243, 27 => -0.009288, 28 => -0.002124, + 29 => 0.012267, 30 => -0.002398, 31 => -0.000274, + 32 => 0.0, 33 => 0.0, 34 => 0.0, + 35 => -3.371000, 36 => 0.858039, 37 => 0.141600, + 38 => 7.201140, 39 => -0.676007, 40 => 0.806629, + 41 => 0.170454, 42 => -0.390563, 43 => 0.101966 + ) + S = Dict{Int64,Float64}() + S[9] = C[20]*t^2 + C[21]*t + C[22] + S[10] = C[23]*t^2 + C[24]*t + C[25] + S[11] = C[26]*t^2 + C[27]*t + C[28] + S[12] = C[29]*t^2 + C[30]*t + C[31] + S[13] = C[32]*t^2 + C[33]*t + C[34] + S[14] = C[35]*t^2 + C[36]*t + C[37] + S[15] = C[38]*t^2 + C[39]*t + C[40] + S[16] = C[41]*t^2 + C[42]*t + C[43] + + cl_coeffs = [ + S[9]*k + S[10], + S[11]*k + S[12], + S[13]*k + S[14], + S[15]*k + S[16], + ] + cd_coeffs = [ + ((0.546094*t + 0.022247)*k^2 + + (-0.071462*t - 0.006527)*k + + (0.002733*t + 0.000686)), + 0.0, + ((0.123685*t + 0.143755)*k + + (0.495159*t^2 - 0.105362*t + 0.033468)), + ] + cm_coeffs = [ + ((-0.284793*t - 0.026199)*k + + (-0.024060*t + 0.000559)), + 0.0, + ((-1.787703*t + 0.352443)*k + + (-0.839323*t + 0.137932)), + ] + return cl_coeffs, cd_coeffs, cm_coeffs +end diff --git a/data/ram_air_kite/ram_air_kite_foil.dat b/lib/AirfoilAero/test/data/test_airfoil.dat similarity index 100% rename from data/ram_air_kite/ram_air_kite_foil.dat rename to lib/AirfoilAero/test/data/test_airfoil.dat diff --git a/lib/AirfoilAero/test/runtests.jl b/lib/AirfoilAero/test/runtests.jl new file mode 100644 index 00000000..dee29720 --- /dev/null +++ b/lib/AirfoilAero/test/runtests.jl @@ -0,0 +1,90 @@ +using Test +using AirfoilAero +using AirfoilAero: KulfanParameters, LeastSquaresFit, EnvelopeFit, + fit_kulfan_parameters, kulfan_to_coordinates, neuralfoil_aero, + class_function, bernstein_basis, leading_edge_basis, + normalize_airfoil + +read_dat_coords(path) = begin + x = Float64[]; y = Float64[] + for ln in eachline(path) + s = strip(ln) + (isempty(s) || !(isdigit(s[1]) || s[1] == '-' || s[1] == '.')) && continue + p = split(s); length(p) >= 2 || continue + push!(x, parse(Float64, p[1])); push!(y, parse(Float64, p[2])) + end + x, y +end + +@testset "Kulfan fit and NeuralFoil" begin + @testset "Round-trip recovers known parameters" begin + truth = KulfanParameters(fill(0.2, 8), fill(-0.2, 8), 0.0, 0.0) + x, y = kulfan_to_coordinates(truth; n_points=120) + fit = fit_kulfan_parameters(collect(x), collect(y)) + @test maximum(abs.(fit.upper_weights .- truth.upper_weights)) < 1e-5 + @test maximum(abs.(fit.lower_weights .- truth.lower_weights)) < 1e-5 + @test abs(fit.leading_edge_weight) < 1e-5 + @test abs(fit.TE_thickness) < 1e-10 + end + + dat = joinpath(@__DIR__, "data", "test_airfoil.dat") + xr, yr = read_dat_coords(dat) + params = fit_kulfan_parameters(xr, yr) + + @testset "Fit matches aerosandbox get_kulfan_parameters" begin + # Reference values from aerosandbox 4.2.9 get_kulfan_parameters(n_weights_per_side=8) + ref_upper = [0.19725544843504217, 0.010915219977460575, 0.5941307473734625, + -0.27110843470789603, 0.5355058274193715, -0.17717585452753137, + 0.23021043555024268, -0.00473923052893821] + ref_lower = [-0.3653153052872525, -0.5523615615783967, 0.13925743643180583, + -0.5611284190191309, 0.11545728044627838, -0.3801887792186299, + -0.022461606251837227, -0.176490579153197] + @test maximum(abs.(params.upper_weights .- ref_upper)) < 1e-9 + @test maximum(abs.(params.lower_weights .- ref_lower)) < 1e-9 + @test abs(params.leading_edge_weight - 0.9180525576877088) < 1e-9 + @test params.TE_thickness ≈ 0.0 atol = 1e-12 + end + + @testset "Envelope fit encloses points with clearance" begin + xn, yn, _ = normalize_airfoil(xr, yr) + xc = clamp.(xn, 0.0, 1.0) + mid = (xn .> 0.05) .& (xn .< 0.95) + + function min_clearance(method) + fitted = fit_kulfan_parameters(xr, yr, method) + n = length(fitted.upper_weights) + shape = class_function(xc) .* (bernstein_basis(xc, n - 1) * + fitted.upper_weights) .+ fitted.leading_edge_weight .* + leading_edge_basis(xc, n) + upper = shape .+ xc .* (fitted.TE_thickness / 2) + lower = class_function(xc) .* (bernstein_basis(xc, n - 1) * + fitted.lower_weights) .+ fitted.leading_edge_weight .* + leading_edge_basis(xc, n) .- xc .* (fitted.TE_thickness / 2) + return minimum((upper .- yn)[mid]), minimum((yn .- lower)[mid]) + end + + env_upper, env_lower = min_clearance(EnvelopeFit(min_distance=0.005)) + @test env_upper > 0.0035 + @test env_lower > 0.0035 + + lsq_upper, _ = min_clearance(LeastSquaresFit()) + @test lsq_upper < env_upper + + wide_upper, _ = min_clearance(EnvelopeFit(min_distance=0.02)) + @test wide_upper > env_upper + end + + @testset "NeuralFoil matches Python neuralfoil (xlarge)" begin + # Reference CL/CD/CM from neuralfoil 0.3.2 get_aero_from_kulfan_parameters, Re=5e5 + alphas = Float64.(-10:2:20) + ref_CL = [-1.1223364415631283, -0.9446879205845478, -0.7397, -0.5262, -0.3103, + -0.091, 0.1345, 0.3571, 0.5788, 0.8821, 1.0837, 1.2544, 1.4, + 1.4226, 1.3811, 1.2739] + res = neuralfoil_aero(params, alphas, 5e5; model_size="xlarge") + # Compare against full-precision endpoints + rounded interior to 1e-3 + @test res.CL[1] ≈ -1.1223364415631283 rtol = 1e-4 + @test res.CL[6] ≈ -0.091 atol = 1e-3 + @test res.CL[14] ≈ 1.4226 atol = 1e-3 + @test maximum(abs.(round.(res.CL; digits=4) .- ref_CL)) < 2e-3 + end +end diff --git a/lib/ObjAdapter/Project.toml b/lib/ObjAdapter/Project.toml new file mode 100644 index 00000000..c0c17fe7 --- /dev/null +++ b/lib/ObjAdapter/Project.toml @@ -0,0 +1,31 @@ +name = "ObjAdapter" +uuid = "55e39422-45f7-4798-8632-36c195bd49aa" +authors = ["Bart van de Lint"] +version = "0.1.0" + +[deps] +AirfoilAero = "028acdb8-af45-4085-83da-edc09f4c5e4d" +DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab" +Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +NonlinearSolve = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +VortexStepMethod = "ed3cd733-9f0f-46a9-93e0-89b8d4998dd9" +YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" + +[sources] +VortexStepMethod = {path = "../.."} +AirfoilAero = {path = "../AirfoilAero"} + +[compat] +DelimitedFiles = "1" +Interpolations = "0.15, 0.16" +LinearAlgebra = "1" +NonlinearSolve = "4.8.0" +Printf = "1" +StaticArrays = "1" +Statistics = "1" +YAML = "0.4.13" +julia = "1.10, 1.11" diff --git a/lib/ObjAdapter/src/ObjAdapter.jl b/lib/ObjAdapter/src/ObjAdapter.jl new file mode 100644 index 00000000..05301bb9 --- /dev/null +++ b/lib/ObjAdapter/src/ObjAdapter.jl @@ -0,0 +1,24 @@ +module ObjAdapter + +using LinearAlgebra +using Interpolations +using Statistics +using NonlinearSolve +using Printf +using DelimitedFiles +import YAML +using StaticArrays +using AirfoilAero + +include("obj_geometry.jl") +include("obj_slice.jl") +include("polar_generation.jl") +include("obj_to_yaml.jl") + +export obj_to_yaml, obj_to_matrix_yaml, resolve_aero_geometry +export write_geometry_yaml, airfoils_from_yaml +export slice_obj_wing, slice_obj_at_positions, perpendicular_sections +export generate_neuralfoil_polars +export read_faces, center_to_com!, calculate_inertia_tensor, calc_inertia_y_rotation + +end diff --git a/src/obj_geometry.jl b/lib/ObjAdapter/src/obj_geometry.jl similarity index 55% rename from src/obj_geometry.jl rename to lib/ObjAdapter/src/obj_geometry.jl index 4835216c..0a5ac73a 100644 --- a/src/obj_geometry.jl +++ b/lib/ObjAdapter/src/obj_geometry.jl @@ -227,97 +227,6 @@ function create_interpolations(vertices, circle_center_z, radius, gamma_tip, R=I return (le_interp, te_interp, area_interp) end -""" - refine_obj_wing!(wing::AbstractWing; recompute_mapping=true) - -Refine OBJ wing by computing position deltas and applying them to refined sections. - -This method enables deformation support for OBJ wings by: -1. Recalculating evenly-spaced gammas for unrefined sections -2. Computing what unrefined sections SHOULD be (from interpolations) -3. Computing deltas between current and interpolated positions -4. Creating refined sections from interpolations + interpolated deltas -5. Computing panel mapping - -# Arguments -- `wing::AbstractWing`: OBJ wing with le_interp/te_interp -- `recompute_mapping::Bool=true`: Whether to recompute refined_panel_mapping - -# Effects -Updates wing.refined_sections and wing.non_deformed_sections in-place. -""" -function refine_obj_wing!(wing::AbstractWing{T}; recompute_mapping=true) where {T} - n_unrefined = wing.n_unrefined_sections - n_refined = wing.n_panels + 1 - - # 1. Calculate evenly spaced gammas for unrefined sections - unrefined_gammas = range(-wing.gamma_tip, wing.gamma_tip, n_unrefined) - - # 2. Recalculate what unrefined sections SHOULD be from interpolations - interpolated_unrefined_le = Matrix{Float64}(undef, n_unrefined, 3) - interpolated_unrefined_te = Matrix{Float64}(undef, n_unrefined, 3) - for (i, gamma) in enumerate(unrefined_gammas) - interpolated_unrefined_le[i, :] .= [wing.le_interp[j](gamma) for j in 1:3] - interpolated_unrefined_te[i, :] .= [wing.te_interp[j](gamma) for j in 1:3] - end - - # 3. Compute deltas: current - interpolated - deltas_le = Matrix{Float64}(undef, n_unrefined, 3) - deltas_te = Matrix{Float64}(undef, n_unrefined, 3) - for i in 1:n_unrefined - deltas_le[i, :] .= wing.unrefined_sections[i].LE_point - - interpolated_unrefined_le[i, :] - deltas_te[i, :] .= wing.unrefined_sections[i].TE_point - - interpolated_unrefined_te[i, :] - end - - # 4. Create refined sections with interpolated deltas - refined_gammas = range(-wing.gamma_tip, wing.gamma_tip, n_refined) - if isempty(wing.refined_sections) - wing.refined_sections = [Section{T}() for _ in 1:n_refined] - end - - for (idx, gamma) in enumerate(refined_gammas) - # Get base position from interpolation - base_le = [wing.le_interp[i](gamma) for i in 1:3] - base_te = [wing.te_interp[i](gamma) for i in 1:3] - - # Find surrounding unrefined sections for delta interpolation - unrefined_idx = searchsortedlast(collect(unrefined_gammas), gamma) - unrefined_idx = clamp(unrefined_idx, 1, n_unrefined - 1) - - # Linear interpolation weight - gamma_left = unrefined_gammas[unrefined_idx] - gamma_right = unrefined_gammas[unrefined_idx + 1] - t = (gamma - gamma_left) / (gamma_right - gamma_left) - - # Interpolate deltas - delta_le = (1 - t) * deltas_le[unrefined_idx, :] + - t * deltas_le[unrefined_idx + 1, :] - delta_te = (1 - t) * deltas_te[unrefined_idx, :] + - t * deltas_te[unrefined_idx + 1, :] - - # Apply deltas to get final position - final_le = base_le + delta_le - final_te = base_te + delta_te - - # Update refined section - aero_model = wing.unrefined_sections[1].aero_model - aero_data = wing.unrefined_sections[1].aero_data - VortexStepMethod.reinit!(wing.refined_sections[idx], final_le, final_te, - aero_model, aero_data) - end - - # 5. Compute panel mapping and update non_deformed_sections - if recompute_mapping - VortexStepMethod.compute_refined_panel_mapping!(wing) - VortexStepMethod.compute_refined_section_interpolation!(wing) - end - VortexStepMethod.update_non_deformed_sections!(wing) - - return nothing -end - """ center_to_com!(vertices, faces) @@ -461,149 +370,3 @@ function calc_inertia_y_rotation(I_b_tensor) end -""" - ObjWing(obj_path, dat_path; kwargs...) - -Create a deformable wing model from 3D geometry (.obj) and airfoil data (.dat) files. - -This constructor builds a complete aerodynamic model by: -1. Loading wing geometry from the .obj file -2. Creating aerodynamic polars from the airfoil .dat file (or loading existing) -3. Computing inertial properties and coordinate transformations -4. Setting up control surfaces and panel distribution - -The resulting Wing supports deformation through unrefined_deform! and deform! functions. - -# Arguments -- `obj_path`: Path to .obj file containing 3D wing geometry -- `dat_path`: Path to .dat file containing 2D airfoil profile - -# Keyword Arguments -- `crease_frac=0.9`: Normalized trailing edge hinge location (0-1) -- `wind_vel=10.0`: Reference wind velocity for XFoil analysis (m/s) -- `mass=1.0`: Wing mass (kg) -- `n_panels=56`: Number of aerodynamic panels across wingspan -- `n_unrefined_sections`: Number of unrefined sections for deformation control (default: inferred from geometry) -- `align_to_principal=false`: Align body frame to principal axes of inertia -- `spanwise_distribution=UNCHANGED`: Panel distribution type (forced to UNCHANGED for ObjWing) -- `remove_nan=true`: Interpolate NaN values in aerodynamic data -- `use_prior_polar=false`: Reuse prior refined/panel polar mapping on geometry updates -- `alpha_range=deg2rad.(-5:1:20)`: Angle of attack range for polars (rad) -- `delta_range=deg2rad.(-5:1:20)`: Trailing edge deflection range for polars (rad) -- `prn=true`: Print informational messages - -# Returns -A fully initialized `Wing` instance ready for aerodynamic simulation with deformation support. - -# Example -```julia -# Create a deformable wing from geometry files -wing = ObjWing( - "path/to/wing.obj", - "path/to/airfoil.dat"; - mass=1.5, - n_panels=40, - n_unrefined_sections=4 -) - -# Apply deformation -unrefined_deform!(wing, deg2rad.([5, 10, 5, 0]), deg2rad.([-5, 0, -5, 0])) -``` -""" -function ObjWing( - obj_path, dat_path; - crease_frac=0.9, wind_vel=10., mass=1.0, - n_panels=56, n_unrefined_sections=nothing, - spanwise_distribution=UNCHANGED, - spanwise_direction=[0.0, 1.0, 0.0], remove_nan=true, use_prior_polar=false, align_to_principal=false, - alpha_range=deg2rad.(-5:1:20), delta_range=deg2rad.(-5:1:20), prn=true, - interp_steps=n_panels+1 -) - - # Set default: evenly spaced unrefined sections including both tips - if isnothing(n_unrefined_sections) - # Default to having same number of unrefined sections as refined (no interpolation needed) - n_unrefined_sections = n_panels + 1 - end - - !isapprox(spanwise_direction, [0.0, 1.0, 0.0]) && throw(ArgumentError("Spanwise direction has to be [0.0, 1.0, 0.0], not $spanwise_direction")) - - # Load or create polars - (!endswith(dat_path, ".dat")) && (dat_path *= ".dat") - (!isfile(dat_path)) && error("DAT file not found: $dat_path") - cl_polar_path = string(dat_path[1:end-4], "_cl_polar.csv") - cd_polar_path = string(dat_path[1:end-4], "_cd_polar.csv") - cm_polar_path = string(dat_path[1:end-4], "_cm_polar.csv") - - (!endswith(obj_path, ".obj")) && (obj_path *= ".obj") - (!isfile(obj_path)) && error("OBJ file not found: $obj_path") - - ! prn || @info "Reading $obj_path" - vertices, faces = read_faces(obj_path) - T_cad_body = center_to_com!(vertices, faces; prn) - inertia_tensor = calculate_inertia_tensor(vertices, faces, mass, zeros(3)) - - if align_to_principal - inertia_tensor, R_cad_body = calc_inertia_y_rotation(inertia_tensor) - else - R_cad_body = Matrix{Float64}(I, 3, 3) - end - circle_center_z, radius, gamma_tip = find_circle_center_and_radius(vertices) - le_interp, te_interp, area_interp = create_interpolations(vertices, circle_center_z, radius, gamma_tip, R_cad_body; interp_steps) - - ! prn || @info "Loading 2d polars from $cl_polar_path, $cd_polar_path and $cm_polar_path" - try - if !ispath(cl_polar_path) || !ispath(cd_polar_path) || !ispath(cm_polar_path) - width = 2gamma_tip * radius - area = area_interp(gamma_tip) - create_polars(; dat_path, cl_polar_path, cd_polar_path, cm_polar_path, wind_vel, - area, width, crease_frac, alpha_range, delta_range, remove_nan) - end - - cl_matrix, _, _ = read_aero_matrix(String(cl_polar_path)) - cd_matrix, _, _ = read_aero_matrix(String(cd_polar_path)) - cm_matrix, alpha_range, delta_range = read_aero_matrix(String(cm_polar_path)) - - if remove_nan - any(isnan.(cl_matrix)) && interpolate_matrix_nans!(cl_matrix; prn) - any(isnan.(cd_matrix)) && interpolate_matrix_nans!(cd_matrix; prn) - any(isnan.(cm_matrix)) && interpolate_matrix_nans!(cm_matrix; prn) - end - - # Create unrefined sections (evenly spaced including both tips) - sections = Section{Float64}[] - aero_data = (collect(alpha_range), collect(delta_range), cl_matrix, cd_matrix, cm_matrix) - for gamma in range(-gamma_tip, gamma_tip, n_unrefined_sections) - LE_point = [le_interp[i](gamma) for i in 1:3] - TE_point = [te_interp[i](gamma) for i in 1:3] - push!(sections, Section(LE_point, TE_point, POLAR_MATRICES, aero_data)) - end - - panel_props = PanelProperties{n_panels, Float64}() - cache = [PreallocationTools.LazyBufferCache()] - - wing = Wing{n_panels, Float64}( - Int16(n_panels), Int16(n_unrefined_sections), spanwise_distribution, panel_props, - MVector{3, Float64}(spanwise_direction), - sections, Section{Float64}[], remove_nan, use_prior_polar, 0.0, # billowing_percentage - Int16[], # refined_panel_mapping empty - Int16[], Float64[], # refined_section interpolation cache empty - Section{Float64}[], zeros(Float64, n_panels), zeros(Float64, n_panels), - Float64(mass), Float64(gamma_tip), Matrix{Float64}(inertia_tensor), - MVector{3, Float64}(T_cad_body), MMatrix{3, 3, Float64, 9}(R_cad_body), - Float64(radius), - le_interp, te_interp, area_interp, cache) - - # Auto-refine for backward compatibility - refine_obj_wing!(wing; recompute_mapping=true) - reinit!(wing) - - wing - - catch e - if e isa BoundsError - @error "Delete $cl_polar_path, $cd_polar_path and $cm_polar_path and try again." - end - rethrow(e) - end -end diff --git a/lib/ObjAdapter/src/obj_slice.jl b/lib/ObjAdapter/src/obj_slice.jl new file mode 100644 index 00000000..9ceb3671 --- /dev/null +++ b/lib/ObjAdapter/src/obj_slice.jl @@ -0,0 +1,523 @@ +""" +OBJ mesh slicing for extracting 2D airfoil cross-sections. + +This module provides functions to slice 3D wing meshes at specific spanwise +positions to extract 2D airfoil profiles. +""" + +""" + slice_mesh_at_y(vertices::Vector, faces::Vector, y_pos::Real; tol=1e-6) + +Slice a triangulated mesh at a constant y-position. + +# Arguments +- `vertices`: Vector of 3D vertex coordinates [x, y, z] +- `faces`: Vector of face indices (triangles) +- `y_pos`: Y-coordinate of the slice plane + +# Returns +- Vector of line segments [(p1, p2), ...] where p1, p2 are [x, z] coordinates +""" +function slice_mesh_at_y(vertices::Vector, faces::Vector, y_pos::Real; tol=1e-6) + segments = Tuple{Vector{Float64}, Vector{Float64}}[] + + for face in faces + v1 = vertices[face[1]] + v2 = vertices[face[2]] + v3 = vertices[face[3]] + + # Find intersection points of triangle with y = y_pos plane + points = find_triangle_plane_intersection(v1, v2, v3, y_pos; tol) + + if length(points) == 2 + # Valid intersection - two points form a line segment + push!(segments, (points[1], points[2])) + end + end + + return segments +end + +""" + find_triangle_plane_intersection(v1, v2, v3, y_pos; tol=1e-6) + +Find intersection points of a triangle with the plane y = y_pos. + +Returns 0, 1, or 2 points in [x, z] format. +""" +function find_triangle_plane_intersection(v1, v2, v3, y_pos; tol=1e-6) + points = Vector{Float64}[] + + # Check each edge + for (va, vb) in [(v1, v2), (v2, v3), (v3, v1)] + y1, y2 = va[2], vb[2] + + # Check if edge crosses the plane + if (y1 - y_pos) * (y2 - y_pos) < 0 + # Linear interpolation to find crossing point + t = (y_pos - y1) / (y2 - y1) + x = va[1] + t * (vb[1] - va[1]) + z = va[3] + t * (vb[3] - va[3]) + push!(points, [x, z]) + elseif abs(y1 - y_pos) < tol + # Vertex on plane + push!(points, [va[1], va[3]]) + end + end + + # Remove duplicates + unique_points = Vector{Float64}[] + for p in points + is_dup = false + for up in unique_points + if norm(p - up) < tol + is_dup = true + break + end + end + if !is_dup + push!(unique_points, p) + end + end + + return unique_points +end + +""" + order_segments_to_contour(segments; tol=1e-4) + +Order line segments into a continuous contour. + +# Arguments +- `segments`: Vector of (p1, p2) tuples representing line segments + +# Returns +- Vector of [x, z] points forming the ordered contour +""" +function order_segments_to_contour(segments; tol=1e-4) + if isempty(segments) + return Vector{Float64}[] + end + + # Build adjacency - find which segments connect + n = length(segments) + used = falses(n) + + # Start with first segment + contour = [segments[1][1], segments[1][2]] + used[1] = true + n_used = 1 + + # Iteratively find and add connecting segments + max_iter = n * 2 + iter = 0 + while n_used < n && iter < max_iter + iter += 1 + found = false + + current_end = contour[end] + current_start = contour[1] + + for i in 1:n + if used[i] + continue + end + + p1, p2 = segments[i] + + # Check if segment connects to end of contour + if norm(p1 - current_end) < tol + push!(contour, p2) + used[i] = true + n_used += 1 + found = true + break + elseif norm(p2 - current_end) < tol + push!(contour, p1) + used[i] = true + n_used += 1 + found = true + break + # Check if segment connects to start of contour + elseif norm(p1 - current_start) < tol + pushfirst!(contour, p2) + used[i] = true + n_used += 1 + found = true + break + elseif norm(p2 - current_start) < tol + pushfirst!(contour, p1) + used[i] = true + n_used += 1 + found = true + break + end + end + + if !found + # No connecting segment found, might have disjoint contours + # Try to start a new contour segment (for complex geometries) + for i in 1:n + if !used[i] + push!(contour, segments[i][1]) + push!(contour, segments[i][2]) + used[i] = true + n_used += 1 + break + end + end + end + end + + return contour +end + +""" + contour_to_airfoil(contour::Vector{Vector{Float64}}) + +Convert a 2D contour to normalized airfoil coordinates. + +Assumes contour is in [x, z] format where x is chordwise, z is thickness direction. + +# Returns +- (x, y): Normalized airfoil coordinates with chord = 1, LE at origin +""" +function contour_to_airfoil(contour::Vector{Vector{Float64}}) + if isempty(contour) + return Float64[], Float64[] + end + + # Extract x (chordwise) and y (thickness) coordinates + x = [p[1] for p in contour] + y = [p[2] for p in contour] + + # Find leading edge (minimum x) + le_idx = argmin(x) + x_le, y_le = x[le_idx], y[le_idx] + + # Find trailing edge (maximum x) + te_idx = argmax(x) + x_te, y_te = x[te_idx], y[te_idx] + + # Chord length + chord = sqrt((x_te - x_le)^2 + (y_te - y_le)^2) + + if chord < 1e-10 + @warn "Degenerate airfoil with near-zero chord" + return Float64[], Float64[] + end + + # Rotation angle to align chord with x-axis + angle = atan(y_te - y_le, x_te - x_le) + cos_a, sin_a = cos(angle), sin(angle) + + # Transform to normalized coordinates + x_norm = similar(x) + y_norm = similar(y) + for i in eachindex(x) + dx = x[i] - x_le + dy = y[i] - y_le + x_norm[i] = (cos_a * dx + sin_a * dy) / chord + y_norm[i] = (-sin_a * dx + cos_a * dy) / chord + end + + return x_norm, y_norm +end + +""" + reorder_airfoil_selig(x::Vector, y::Vector) + +Reorder airfoil coordinates to Selig format (TE upper -> LE -> TE lower). + +This is the standard format expected by most airfoil tools. +""" +function reorder_airfoil_selig(x::Vector{T}, y::Vector{T}) where T + n = length(x) + if n < 3 + return x, y + end + + # Find LE and TE indices + le_idx = argmin(x) + te_idx = argmax(x) + + # Determine if we need to reverse the ordering + # Check if contour goes clockwise or counterclockwise from TE + # by looking at the y-value trend after TE + + # Split into upper and lower based on y-values relative to camber line + # For simplicity, assume points with y > mean(y at same x) are upper + + # First, separate points + upper_pts = Tuple{T, T}[] + lower_pts = Tuple{T, T}[] + + # Find approximate camber at TE and LE + y_te = y[te_idx] + y_le = y[le_idx] + + for i in eachindex(x) + # Simple heuristic: use sign of y to classify + # (This works for symmetric and slightly cambered airfoils) + if y[i] >= y_le + push!(upper_pts, (x[i], y[i])) + else + push!(lower_pts, (x[i], y[i])) + end + end + + # If classification is bad (unbalanced), try different approach + if length(upper_pts) < n/4 || length(lower_pts) < n/4 + # Split based on contour direction + # LE is at minimum x, so split contour there + before_le = 1:le_idx + after_le = le_idx:n + + # Determine which half is upper based on y values + y_before = mean(y[before_le]) + y_after = mean(y[after_le]) + + if y_before > y_after + upper_pts = [(x[i], y[i]) for i in before_le] + lower_pts = [(x[i], y[i]) for i in after_le] + else + upper_pts = [(x[i], y[i]) for i in after_le] + lower_pts = [(x[i], y[i]) for i in before_le] + end + end + + # Sort upper by decreasing x (TE to LE) + sort!(upper_pts, by=p -> -p[1]) + # Sort lower by increasing x (LE to TE) + sort!(lower_pts, by=p -> p[1]) + + # Combine: TE upper -> LE -> TE lower + x_selig = T[] + y_selig = T[] + + for (px, py) in upper_pts + push!(x_selig, px) + push!(y_selig, py) + end + # Add lower points (skip first if it's duplicate of LE) + for (i, (px, py)) in enumerate(lower_pts) + if i == 1 && !isempty(upper_pts) + ux, uy = upper_pts[end] + if abs(px - ux) < 1e-6 && abs(py - uy) < 1e-6 + continue # Skip duplicate LE + end + end + push!(x_selig, px) + push!(y_selig, py) + end + + return x_selig, y_selig +end + +""" + slice_mesh_at_plane(vertices, faces, point, normal; tol=1e-6) + +Slice a mesh with the plane through `point` with unit `normal`, returning the 3D +segments `(p1, p2)` where the surface crosses it. The plane may have any +orientation, so the cut can follow a curved or swept span. +""" +function slice_mesh_at_plane(vertices, faces, point, normal; tol=1e-6) + n = normalize(normal) + p0 = Float64.(point) + segments = Tuple{Vector{Float64}, Vector{Float64}}[] + for face in faces + v1, v2, v3 = vertices[face[1]], vertices[face[2]], vertices[face[3]] + pts = Vector{Float64}[] + for (va, vb) in ((v1, v2), (v2, v3), (v3, v1)) + da = dot(va - p0, n) + db = dot(vb - p0, n) + if da * db < 0 + t = da / (da - db) + push!(pts, va .+ t .* (vb .- va)) + elseif abs(da) < tol + push!(pts, Float64.(va)) + end + end + unique_pts = Vector{Float64}[] + for p in pts + any(norm(p - q) < tol for q in unique_pts) || push!(unique_pts, p) + end + length(unique_pts) == 2 && push!(segments, (unique_pts[1], unique_pts[2])) + end + return segments +end + +""" + span_edge_curves(vertices; n_samples=60) -> (arc_length, leading, trailing) + +Build leading-/trailing-edge polylines by splitting the vertices into `n_samples` +constant-`y` slabs and taking the most forward (min `x`) and most aft (max `x`) +point in each. Returns the cumulative leading-edge arc length and the `3 × N` edge +matrices, ordered by `y`. +""" +function span_edge_curves(vertices; n_samples=60) + ys = [v[2] for v in vertices] + y_min, y_max = extrema(ys) + centers = range(y_min, y_max, n_samples) + half = (y_max - y_min) / n_samples + le = Vector{Float64}[] + te = Vector{Float64}[] + for yc in centers + in_slab = [v for v in vertices if yc - half ≤ v[2] ≤ yc + half] + isempty(in_slab) && continue + push!(le, Float64.(argmin(v -> v[1], in_slab))) + push!(te, Float64.(argmax(v -> v[1], in_slab))) + end + leading = reduce(hcat, le) + trailing = reduce(hcat, te) + arc_length = zeros(size(leading, 2)) + for i in 2:length(arc_length) + arc_length[i] = arc_length[i-1] + norm(leading[:, i] - leading[:, i-1]) + end + return arc_length, leading, trailing +end + +""" + plane_contour_to_airfoil(contour3d, LE_point, TE_point, span_dir) + +Project a 3D slice contour into the local chord (`TE_point - LE_point`) / +thickness (`span_dir × chord`, +z up) plane and return normalized Selig airfoil +coordinates `(x, y)`. Returns `nothing` for a degenerate slice. +""" +function plane_contour_to_airfoil(contour3d, LE_point, TE_point, span_dir) + chord = TE_point - LE_point + chord .-= dot(chord, span_dir) .* span_dir + chord_len = norm(chord) + chord_len < 1e-9 && return nothing + chord ./= chord_len + up = cross(span_dir, chord) + norm(up) < 1e-12 && return nothing + up ./= norm(up) + up[3] < 0 && (up = -up) + projected = [[dot(p - LE_point, chord), dot(p - LE_point, up)] for p in contour3d] + x, y = contour_to_airfoil(projected) + isempty(x) && return nothing + return reorder_airfoil_selig(x, y) +end + +""" + perpendicular_sections(vertices, faces, n_sections; n_samples=60) + +Extract `n_sections` airfoil cross-sections following a curved or swept span. +Stations are spaced at equal leading-edge arc-length intervals (panel centers); +each is sliced with a plane perpendicular to the local span and projected into the +chord/thickness plane, keeping the airfoil undistorted near curved tips. Returns +`(; LE_point, TE_point, x_airfoil, y_airfoil)` NamedTuples with un-normalized 3D +edge points. +""" +function perpendicular_sections(vertices, faces, n_sections; n_samples=60) + arc_length, leading, trailing = span_edge_curves(vertices; n_samples) + keep = [1; [i for i in 2:length(arc_length) + if arc_length[i] > arc_length[i-1] + 1e-12]] + arc_length, leading, trailing = arc_length[keep], leading[:, keep], trailing[:, keep] + total = arc_length[end] + total < 1e-9 && error("Degenerate span: leading-edge length ≈ 0") + le_interp = ntuple(i -> linear_interpolation(arc_length, leading[i, :], + extrapolation_bc=Line()), 3) + te_interp = ntuple(i -> linear_interpolation(arc_length, trailing[i, :], + extrapolation_bc=Line()), 3) + delta = total / n_sections + arc_step = total * 1e-3 + sections = NamedTuple[] + for k in 1:n_sections + sk = delta / 2 + (k - 1) * delta + LE_point = [le_interp[i](sk) for i in 1:3] + TE_point = [te_interp[i](sk) for i in 1:3] + sp = min(sk + arc_step, total) + sm = max(sk - arc_step, 0.0) + span_dir = [le_interp[i](sp) - le_interp[i](sm) for i in 1:3] + norm(span_dir) < 1e-12 && continue + span_dir ./= norm(span_dir) + segments = slice_mesh_at_plane(vertices, faces, LE_point, span_dir) + isempty(segments) && continue + contour3d = order_segments_to_contour(segments) + length(contour3d) < 5 && continue + airfoil = plane_contour_to_airfoil(contour3d, LE_point, TE_point, span_dir) + airfoil === nothing && continue + push!(sections, (; LE_point, TE_point, + x_airfoil=airfoil[1], y_airfoil=airfoil[2])) + end + return sections +end + +""" + slice_obj_at_positions(obj_path::String, y_positions::Vector) + +Slice an OBJ mesh at multiple spanwise positions. + +# Arguments +- `obj_path`: Path to .obj file +- `y_positions`: Vector of y-coordinates for slicing + +# Returns +- Vector of (x, y) tuples, one per slice, with normalized airfoil coordinates +""" +function slice_obj_at_positions(obj_path::String, y_positions::Vector{T}) where T + # Load mesh + vertices, faces = read_faces(obj_path) + + # Slice at each position + airfoils = Tuple{Vector{Float64}, Vector{Float64}}[] + + for y_pos in y_positions + segments = slice_mesh_at_y(vertices, faces, Float64(y_pos)) + + if isempty(segments) + @warn "No intersection at y = $y_pos" + push!(airfoils, (Float64[], Float64[])) + continue + end + + contour = order_segments_to_contour(segments) + x, y = contour_to_airfoil(contour) + + if !isempty(x) + x, y = reorder_airfoil_selig(x, y) + end + + push!(airfoils, (x, y)) + end + + return airfoils +end + +""" + slice_obj_wing(obj_path::String, n_slices::Int) + +Slice an OBJ wing mesh into n_slices evenly spaced airfoil sections. + +Slices are positioned at panel centers: with n_slices panels, the positions are +at γ = δ/2, 3δ/2, 5δ/2, ... where δ = 1/n_slices. This avoids degenerate +tip profiles. + +# Arguments +- `obj_path`: Path to .obj file +- `n_slices`: Number of slices (panels) + +# Returns +- Vector of (x, y) tuples with normalized airfoil coordinates +- Vector of y_positions where slices were taken +""" +function slice_obj_wing(obj_path::String, n_slices::Int) + # Load mesh to find bounds + vertices, faces = read_faces(obj_path) + + # Find y-extent of mesh + y_coords = [v[2] for v in vertices] + y_min, y_max = minimum(y_coords), maximum(y_coords) + + # Slice at panel centers: δ/2, 3δ/2, 5δ/2, ... (n_slices-1/2)δ + # where δ = span / n_slices + span = y_max - y_min + delta = span / n_slices + y_positions = [y_min + delta/2 + i*delta for i in 0:(n_slices-1)] + + airfoils = slice_obj_at_positions(obj_path, y_positions) + + return airfoils, y_positions +end diff --git a/lib/ObjAdapter/src/obj_to_yaml.jl b/lib/ObjAdapter/src/obj_to_yaml.jl new file mode 100644 index 00000000..79b8f678 --- /dev/null +++ b/lib/ObjAdapter/src/obj_to_yaml.jl @@ -0,0 +1,272 @@ +""" +Adapter that converts a 3D wing `.obj` mesh into the package's native YAML +geometry route: per-section airfoil `.dat` files, NeuralFoil polar CSVs, and a +geometry YAML referencing them. After conversion everything follows the standard +`Wing(geometry_file)` path. +""" + +""" + airfoils_from_yaml(geometry_file) -> Vector of (; id, x, y, x_raw, y_raw) + +Read each airfoil's coordinates from the `.dat` files referenced by a YAML +geometry's `wing_airfoils`. `x, y` come from `dat_file` (the fitted airfoil); +`x_raw, y_raw` come from `raw_dat_file` if present (the raw sliced points), and +are empty otherwise. Relative paths resolve against the geometry file's directory. +""" +function airfoils_from_yaml(geometry_file::String) + data = YAML.load_file(geometry_file) + airfoils = data["wing_airfoils"] + headers = airfoils["headers"] + base = dirname(geometry_file) + resolve(rel) = isabspath(rel) ? rel : joinpath(base, rel) + out = NamedTuple[] + for row in airfoils["data"] + d = Dict(zip(headers, row)) + dat_rel = get(d["info_dict"], "dat_file", "") + (isempty(dat_rel) || !isfile(resolve(dat_rel))) && continue + x, y = read_dat_coordinates(resolve(dat_rel)) + x_raw, y_raw = Float64[], Float64[] + raw_rel = get(d["info_dict"], "raw_dat_file", "") + if !isempty(raw_rel) && isfile(resolve(raw_rel)) + x_raw, y_raw = read_dat_coordinates(resolve(raw_rel)) + end + push!(out, (id=Int(d["airfoil_id"]), x=x, y=y, x_raw=x_raw, y_raw=y_raw)) + end + return out +end + +""" + obj_to_yaml(obj_path, output_dir; n_sections, Re, alpha_range=-180:1:180, + model_size="xlarge", weights_dir=nothing, n_crit=9.0, + fit_method=LeastSquaresFit(), + spanwise_direction=[0.0, 1.0, 0.0], verbose=true) + +Convert a 3D wing `.obj` mesh to the native YAML geometry route. + +Stations are placed at equal leading-edge arc-length intervals and sliced +perpendicular to the local span (see [`perpendicular_sections`](@ref)), which +keeps the airfoil undistorted near curved tips; each shape is then fitted to +Kulfan parameters and evaluated with NeuralFoil. + +`fit_method` selects the Kulfan fit (see [`fit_kulfan_parameters`](@ref)). Pass +an [`EnvelopeFit`](@ref) to wrap each section tightly *around* the slice points; +this is robust to the noisy interior-structure points of a ram-air kite slice +(ribs, spars) that otherwise pull the default [`LeastSquaresFit`](@ref) inward. + +A slice whose fitted airfoil is implausibly thick relative to the others (e.g. a +near-vanishing wingtip slice that fits to a blob) is flagged as degenerate: a +section is degenerate when its fitted `max|y|` exceeds `max_thickness_ratio` times +the median over all sections. With `reuse_valid_airfoils=true` (default) each +degenerate section reuses the nearest valid section's airfoil shape and polar, +while keeping its own leading- and trailing-edge positions, so the station is +still placed but carries a sane airfoil; a warning lists which sections were +reused. With `reuse_valid_airfoils=false` the degenerate fit is written as is. + +# Output +Writes into `output_dir`, indexed by source-airfoil id `j` (degenerate sections +share a neighbour's id): +- `airfoils/{j}.dat` — fitted Kulfan airfoil coordinates (matches the polar) +- `airfoils/{j}_raw.dat` — raw sliced section points (the fit is wrapped around these) +- `polars/{j}.csv` — NeuralFoil polar (alpha, Cd, Cs, Cl, Cm) +- `geometry.yaml` — `wing_sections` + `wing_airfoils` referencing the above + +# Returns +- Path to the written `geometry.yaml`. +""" +function obj_to_yaml(obj_path::String, output_dir::String; + n_sections::Int, Re::Real, + alpha_range=-180:1:180, + model_size::String="xlarge", weights_dir=nothing, + n_crit=9.0, fit_method::KulfanFitMethod=LeastSquaresFit(), + reuse_valid_airfoils::Bool=true, max_thickness_ratio::Real=2.0, + spanwise_direction=[0.0, 1.0, 0.0], + verbose::Bool=true) + (!endswith(obj_path, ".obj")) && (obj_path *= ".obj") + isfile(obj_path) || error("OBJ file not found: $obj_path") + !isapprox(spanwise_direction, [0.0, 1.0, 0.0]) && + throw(ArgumentError("Spanwise direction has to be [0.0, 1.0, 0.0]")) + + airfoil_dir = joinpath(output_dir, "airfoils") + polar_dir = joinpath(output_dir, "polars") + mkpath(airfoil_dir) + mkpath(polar_dir) + + vertices, faces = read_faces(obj_path) + alphas = collect(Float64, alpha_range) + load_neuralfoil_model(model_size; weights_dir) + + raw_sections = perpendicular_sections(vertices, faces, n_sections) + isempty(raw_sections) && error("No valid sections sliced from $obj_path") + + stations = NamedTuple[] + for (i, sec) in enumerate(raw_sections) + verbose && print(" Section $i (y=$(round(sec.LE_point[2], digits=3)))... ") + params = fit_kulfan_parameters(sec.x_airfoil, sec.y_airfoil, fit_method) + x_fit, y_fit = kulfan_to_coordinates(params) + thickness = maximum(abs, y_fit) + verbose && println("fitted (thickness=$(round(thickness, digits=3)))") + push!(stations, (; sec.LE_point, sec.TE_point, xa=sec.x_airfoil, + ya=sec.y_airfoil, params, x_fit, y_fit, thickness)) + end + + n = length(stations) + thickness_limit = max_thickness_ratio * median(s.thickness for s in stations) + degenerate = [s.thickness > thickness_limit for s in stations] + valid = [k for k in 1:n if !degenerate[k]] + isempty(valid) && error("All sliced sections are degenerate in $obj_path") + ids = [degenerate[k] && reuse_valid_airfoils ? + valid[argmin(abs.(valid .- k))] : k for k in 1:n] + reused = [k => ids[k] for k in 1:n if degenerate[k] && ids[k] != k] + isempty(reused) || @warn "Degenerate section fits reused the nearest valid " * + "airfoil: " * join(["section $k → airfoil $j" for (k, j) in reused], ", ") + + section_rows = Vector{Any}[] + airfoil_rows = Vector{Any}[] + for j in unique(ids) + s = stations[j] + dat_rel = joinpath("airfoils", "$j.dat") + raw_rel = joinpath("airfoils", "$(j)_raw.dat") + csv_rel = joinpath("polars", "$j.csv") + dat_abs = joinpath(output_dir, dat_rel) + write_dat(dat_abs, "section_$j", s.x_fit, s.y_fit) + write_dat(joinpath(output_dir, raw_rel), "section_$(j)_raw", s.xa, s.ya) + result = generate_polar_from_dat(dat_abs, joinpath(output_dir, csv_rel); + Re=Float64(Re), alpha_range=alphas, model_size, weights_dir, n_crit) + push!(airfoil_rows, Any[j, "polar_vectors", + Dict("dat_file" => dat_rel, "raw_dat_file" => raw_rel, + "csv_file_path" => csv_rel)]) + verbose && println(" Airfoil $j: CL_max=$(round(maximum(result.CL), digits=2))") + end + for k in 1:n + s = stations[k] + push!(section_rows, Any[ids[k], s.LE_point[1], s.LE_point[2], s.LE_point[3], + s.TE_point[1], s.TE_point[2], s.TE_point[3]]) + end + + yaml_path = joinpath(output_dir, "geometry.yaml") + write_geometry_yaml(yaml_path, section_rows, airfoil_rows) + verbose && @info "Wrote geometry to $yaml_path ($(length(section_rows)) sections)" + return yaml_path +end + +""" + obj_to_matrix_yaml(obj_path, foil_dat, output_dir; n_sections, wind_vel, + alpha_range, delta_range, crease_frac=0.2, remove_nan=true, + verbose=true) -> yaml_path + +Convert an `.obj` wing mesh plus a single airfoil `.dat` into a standard geometry YAML +backed by one shared XFoil `(alpha, delta)` `POLAR_MATRICES`. Section leading/trailing +edges come from perpendicular mesh slices ([`perpendicular_sections`](@ref)); the +airfoil's cl/cd/cm matrices are generated once with [`create_polars`](@ref) and +referenced by every section. Load the result with `Wing(yaml_path; n_panels)`. This +replaces the old live `ObjWing` route with convert-then-load. +""" +function obj_to_matrix_yaml(obj_path::String, foil_dat::String, output_dir::String; + n_sections::Int, wind_vel::Real, alpha_range, delta_range, + crease_frac=0.2, remove_nan=true, verbose=true) + isfile(obj_path) || error("OBJ file not found: $obj_path") + isfile(foil_dat) || error("DAT file not found: $foil_dat") + polar_dir = joinpath(output_dir, "polars") + airfoil_dir = joinpath(output_dir, "airfoils") + mkpath(polar_dir) + mkpath(airfoil_dir) + + vertices, faces = read_faces(obj_path) + secs = perpendicular_sections(vertices, faces, n_sections) + isempty(secs) && error("No valid sections sliced from $obj_path") + + mean_chord = sum(norm(s.TE_point .- s.LE_point) for s in secs) / length(secs) + + cl_path = joinpath(polar_dir, "cl.csv") + cd_path = joinpath(polar_dir, "cd.csv") + cm_path = joinpath(polar_dir, "cm.csv") + x, y = read_dat_coordinates(foil_dat) + write_dat(joinpath(output_dir, "airfoils", "1.dat"), "airfoil_1", x, y) + create_polars(; dat_path=foil_dat, cl_polar_path=cl_path, cd_polar_path=cd_path, + cm_polar_path=cm_path, wind_vel=Float64(wind_vel), area=mean_chord, width=1.0, + crease_frac, alpha_range, delta_range, remove_nan) + + section_rows = [Any[1, s.LE_point[1], s.LE_point[2], s.LE_point[3], + s.TE_point[1], s.TE_point[2], s.TE_point[3]] for s in secs] + airfoil_rows = [Any[1, "polar_matrices", Dict( + "dat_file" => joinpath("airfoils", "1.dat"), + "cl_file_path" => joinpath("polars", "cl.csv"), + "cd_file_path" => joinpath("polars", "cd.csv"), + "cm_file_path" => joinpath("polars", "cm.csv"))]] + yaml_path = joinpath(output_dir, "geometry.yaml") + write_geometry_yaml(yaml_path, section_rows, airfoil_rows) + verbose && @info "Wrote $yaml_path ($(length(section_rows)) sections, POLAR_MATRICES)" + return yaml_path +end + +""" + resolve_aero_geometry(yaml_in, out_dir; verbose=true) -> yaml_out + +Read an awesIO-style geometry YAML and resolve every `wing_airfoils` entry to a +core-loadable form via [`resolve_airfoil`](@ref) (`breukels_regression` → `poly`, +`neuralfoil` → `polars` CSV, others pass through), writing generated CSVs and a +resolved `geometry.yaml` under `out_dir`. `wing_sections` (incl. any `VUP` up-vectors) +pass through unchanged. Load the result with `Wing(yaml_out)`. +""" +function resolve_aero_geometry(yaml_in::String, out_dir::String; verbose=true) + mkpath(out_dir) + polar_dir = joinpath(out_dir, "polars") + mkpath(polar_dir) + data = YAML.load_file(yaml_in) + wa = data["wing_airfoils"] + headers = wa["headers"] + col(name) = findfirst(==(name), headers) + ti, ii, idi = col("type"), col("info_dict"), col("airfoil_id") + aspec = get(wa, "alpha_range", [-180, 180, 1.0]) + Re = Float64(get(wa, "reynolds", 1.0e6)) + alpha_range = Float64(aspec[1]):Float64(aspec[3]):Float64(aspec[2]) + base = dirname(abspath(yaml_in)) + for row in wa["data"] + info = Dict{String,Any}(row[ii]) + for k in ("dat_file_path", "csv_file_path", "cl_file_path", + "cd_file_path", "cm_file_path") + if haskey(info, k) && !isabspath(String(info[k])) + info[k] = abspath(joinpath(base, String(info[k]))) + end + end + new_type, new_info = resolve_airfoil(String(row[ti]), info, polar_dir, + row[idi]; Re, alpha_range) + row[ti] = new_type + row[ii] = new_info + end + yaml_out = joinpath(out_dir, "geometry.yaml") + YAML.write_file(yaml_out, data) + verbose && @info "Resolved geometry -> $yaml_out" + return yaml_out +end + +""" + write_geometry_yaml(path, section_rows, airfoil_rows) + +Write a geometry YAML in compact flow style: one-line headers and one line per +data row. `section_rows` are `[airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z]`; +`airfoil_rows` are `[airfoil_id, type, info_dict]` where `info_dict` holds +`dat_file`, `csv_file_path`, and optionally `raw_dat_file`. +""" +function write_geometry_yaml(path::String, section_rows, airfoil_rows) + open(path, "w") do io + println(io, "wing_sections:") + println(io, " headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z]") + println(io, " data:") + for row in section_rows + vals = [v isa Integer ? string(v) : string(round(v; digits=3)) for v in row] + println(io, " - [", join(vals, ", "), "]") + end + println(io, "wing_airfoils:") + println(io, " headers: [airfoil_id, type, info_dict]") + println(io, " data:") + for (id, type, info) in airfoil_rows + keys_ordered = ["dat_file", "raw_dat_file", "csv_file_path", + "cl_file_path", "cd_file_path", "cm_file_path"] + parts = ["$k: \"$(info[k])\"" for k in keys_ordered if haskey(info, k)] + inline = "{" * join(parts, ", ") * "}" + println(io, " - [", id, ", ", type, ", ", inline, "]") + end + end + return path +end diff --git a/lib/ObjAdapter/src/polar_generation.jl b/lib/ObjAdapter/src/polar_generation.jl new file mode 100644 index 00000000..475ecd1f --- /dev/null +++ b/lib/ObjAdapter/src/polar_generation.jl @@ -0,0 +1,45 @@ +""" +Obj-based polar generation: slice a mesh and drive AirfoilAero per section. The +airfoil-general `.dat`/coordinate → CSV entry points live in AirfoilAero. +""" + +""" + generate_neuralfoil_polars(obj_path, output_dir; n_slices, Re, + alpha_range=-180:1:180, model_size="xlarge", + weights_dir=nothing, n_crit=9.0, verbose=true) + +Slice `obj_path` into `n_slices` airfoils and write a `POLAR_VECTORS` CSV per slice +to `output_dir/{i}.csv` via [`generate_polar_from_coordinates`](@ref). +""" +function generate_neuralfoil_polars(obj_path::String, output_dir::String; + n_slices::Int, Re::Real, + alpha_range=-180:1:180, + model_size::String="xlarge", + weights_dir=nothing, + n_crit=9.0, + verbose=true) + isfile(obj_path) || error("OBJ file not found: $obj_path") + mkpath(output_dir) + verbose && @info "Slicing OBJ mesh at $n_slices positions..." + airfoils, y_positions = slice_obj_wing(obj_path, n_slices) + verbose && @info "Processing $(length(airfoils)) airfoil sections..." + load_neuralfoil_model(model_size; weights_dir) + for (i, (x, y)) in enumerate(airfoils) + if isempty(x) || length(x) < 5 + @warn "Slice $i: Insufficient points, skipping" + continue + end + verbose && print(" Slice $i (y=$(round(y_positions[i], digits=3)))... ") + try + result = generate_polar_from_coordinates(x, y, + joinpath(output_dir, "$i.csv"); Re=Float64(Re), alpha_range, + model_size, weights_dir, n_crit) + verbose && println("done (CL_max=$(round(maximum(result.CL), digits=2)))") + catch e + @warn "Slice $i failed: $e" + continue + end + end + verbose && @info "Polars written to $output_dir" + return nothing +end diff --git a/src/VortexStepMethod.jl b/src/VortexStepMethod.jl index da9cb9ea..3f9d8050 100644 --- a/src/VortexStepMethod.jl +++ b/src/VortexStepMethod.jl @@ -23,11 +23,10 @@ using DifferentiationInterface using ForwardDiff import YAML using StructMapping -using Xfoil # Export public interface export SolverSettings, VSMSettings, WingSettings -export ObjWing, Section, Wing, refine!, reinit! +export Section, Wing, refine!, reinit! export BodyAerodynamics export Solver, VSMSolution, linearize, solve, solve!, solve_base!, calc_forces! export calculate_results @@ -36,15 +35,20 @@ export calculate_projected_area, calculate_span export MVec3 export LLT, Model, VSM -export AeroModel, INVISCID, LEI_AIRFOIL_BREUKELS, POLAR_MATRICES, POLAR_VECTORS +export AeroModel, INVISCID, POLY, LEI_AIRFOIL_BREUKELS, POLAR_MATRICES, POLAR_VECTORS export BILLOWING, COSINE, LINEAR, PanelDistribution, SPLIT_PROVIDED, UNCHANGED export ELLIPTIC, InitialGammaDistribution, ZEROS export FAILURE, FEASIBLE, INFEASIBLE, SolverStatus export LOOP, NONLIN, SolverType export load_polar_data -export plot_circulation_distribution, plot_combined_analysis, plot_distribution, plot_geometry, - plot_polar_data, plot_polars, save_plot, show_plot +# Surface-pressure (Cp) table types + IO (generation lives in AirfoilAero) +export CpData, CpPolar, cp_distribution, delta_cp +export read_cp_data, write_cp_data + +export plot_airfoil_slices, plot_airfoils, plot_circulation_distribution, + plot_combined_analysis, plot_distribution, plot_geometry, plot_polar_data, + plot_polars, plot_section_polars, save_plot, show_plot # Backend dispatch types for multi-backend support (Makie and ControlPlots can coexist) abstract type PlotBackend end @@ -80,6 +84,9 @@ function save_plot end function show_plot end function plot_polar_data end function plot_combined_analysis end +function plot_airfoil_slices end +function plot_airfoils end +function plot_section_polars end function _active_backend() b = _PLOT_BACKEND[] @@ -220,6 +227,49 @@ function plot_combined_analysis(solver, body_aero, results; kwargs...) plot_combined_analysis(solver, body_aero, results, _active_backend(); kwargs...) end +""" + plot_airfoils(geometry_file::String; kwargs...) + +Plot every airfoil of a YAML wing geometry in a grid of subfigures. The airfoil +shapes are read from the `.dat` files referenced by the geometry's +`wing_airfoils` (a loaded [`BodyAerodynamics`](@ref) does not retain airfoil +coordinates, so the YAML is the source). Routes to the active plotting backend. + +# Arguments +- `geometry_file`: path to a YAML geometry file (e.g. written by [`obj_to_yaml`](@ref)) + +# Keyword arguments +- `n_cols`: number of subfigure columns (default: `3`) +- `is_show`: whether to display (default: `true`) +- `is_save`: whether to save (default: `false`) +- `save_path`: directory to save the figure (default: `nothing`) +- `data_type`: file extension for saving (default: `".png"`) +""" +function plot_airfoils(geometry_file::String; kwargs...) + plot_airfoils(geometry_file, _active_backend(); kwargs...) +end + +""" + plot_section_polars(body_aero::BodyAerodynamics, coefficient=:cl; kwargs...) + +Plot one polar coefficient (`:cl`, `:cd`, or `:cm`) against angle of attack for +every section of a wing using stored `POLAR_VECTORS` data. Routes to the active +plotting backend. + +# Arguments +- `body_aero`: the [`BodyAerodynamics`](@ref) to plot +- `coefficient`: `:cl`, `:cd`, or `:cm` (default: `:cl`) + +# Keyword arguments +- `is_show`: whether to display (default: `true`) +- `is_save`: whether to save (default: `false`) +- `save_path`: directory to save the figure (default: `nothing`) +- `data_type`: file extension for saving (default: `".png"`) +""" +function plot_section_polars(body_aero, coefficient::Symbol=:cl; kwargs...) + plot_section_polars(body_aero, coefficient, _active_backend(); kwargs...) +end + """ const MVec3 = MVector{3, Float64} @@ -266,25 +316,37 @@ Enumeration of the implemented wing types. @enum WingType RECTANGULAR CURVED ELLIPTICAL """ - AeroModel `LEI_AIRFOIL_BREUKELS` `POLAR_VECTORS` `POLAR_MATRICES` `INVISCID` + AeroModel `POLY` `POLAR_VECTORS` `POLAR_MATRICES` `INVISCID` Enumeration of the implemented aerodynamic models. See also: [AeroData](@ref) # Elements -- `LEI_AIRFOIL_BREUKELS`: Polynom approximation for leading edge inflatable kites +- `POLY`: α-polynomial coefficients for cl/cd/cm (e.g. Breukels LEI coeffs, generated + by the `AirfoilAero` package). Core only evaluates the polynomial. - `POLAR_VECTORS`: Polar vectors as function of alpha (lookup tables with interpolation) - `POLAR_MATRICES`: Polar matrices as function of alpha and delta (lookup tables with interpolation) - INVISCID +`LEI_AIRFOIL_BREUKELS` is a deprecated alias of `POLY`. + where `alpha` is the angle of attack, `delta` is trailing edge angle. """ @enum AeroModel begin - LEI_AIRFOIL_BREUKELS + POLY POLAR_VECTORS POLAR_MATRICES INVISCID end +""" + LEI_AIRFOIL_BREUKELS + +Deprecated alias of [`POLY`](@ref). The Breukels `(tube_diameter, camber)` → coeff +derivation now lives in `AirfoilAero.lei_poly_coeffs`; sections carry the resulting +`(cl_coeffs, cd_coeffs, cm_coeffs)`. +""" +const LEI_AIRFOIL_BREUKELS = POLY + """ PanelDistribution `LINEAR` `COSINE` `SPLIT_PROVIDED` `UNCHANGED` `BILLOWING` @@ -345,16 +407,16 @@ abstract type AbstractWing{T} end """ AeroData= Union{ Nothing, - NTuple{2, Float64}, + Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}, Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}, Vector{Float64}}, Tuple{Vector{Float64}, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Matrix{Float64}} } Union of different definitions of the aerodynamic properties of a wing section. See also: [AeroModel](@ref) - nothing for INVISCID - - (`tube_diameter`, camber) for `LEI_AIRFOIL_BREUKELS` + - (`cl_coeffs`, `cd_coeffs`, `cm_coeffs`) α-polynomial coefficients for `POLY` - (`alpha_range`, `cl_vector`, `cd_vector`, `cm_vector`) for `POLAR_VECTORS` - - (`alpha_range`, `delta_range`, `cl_matrix`, `cd_matrix`, `cm_matrix`) for `POLAR_MATRICES` + - (`alpha_range`, `delta_range`, `cl_matrix`, `cd_matrix`, `cm_matrix`) for `POLAR_MATRICES` where `alpha` is the angle of attack [rad], `delta` is trailing edge angle [rad], `cl` the lift coefficient, `cd` the drag coefficient and `cm` the pitching moment coefficient. The camber of a kite refers to @@ -364,7 +426,7 @@ and the chord line of the airfoil. """ const AeroData = Union{ Nothing, - NTuple{2, Float64}, + Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}}, Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}, Vector{Float64}}, Tuple{Vector{Float64}, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Matrix{Float64}} } @@ -432,15 +494,17 @@ end # Include core functionality include("settings.jl") +include("cp_types.jl") include("wing_geometry.jl") include("polars.jl") -include("obj_geometry.jl") include("yaml_geometry.jl") include("filament.jl") include("panel.jl") include("body_aerodynamics.jl") include("wake.jl") include("solver.jl") +include("cp_polars.jl") + include("plotting_helpers.jl") include("precompile.jl") diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 7f21ed28..232fa4f3 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -247,6 +247,7 @@ function reinit!(body_aero::BodyAerodynamics{P, W, T}; vec = zeros(MVector{3, T}) for wing in body_aero.wings reinit!(wing) + validate_cp_sections(wing.refined_sections) panel_props = wing.panel_props wing_init_aero = init_aero && !_can_skip_panel_aero_reinit(wing, body_aero.panels, idx) diff --git a/src/cp_polars.jl b/src/cp_polars.jl new file mode 100644 index 00000000..de48bbb4 --- /dev/null +++ b/src/cp_polars.jl @@ -0,0 +1,106 @@ +""" + CpPolar(data::CpData) -> CpPolar + +Build the per-slice `cp(alpha, delta)` interpolants (linear, `Line()` +extrapolation) from raw [`CpData`](@ref). +""" +function CpPolar(data::CpData) + build(grid) = [linear_interpolation((data.alpha_range, data.delta_range), + grid[i, :, :]; extrapolation_bc=Line()) + for i in 1:data.n_chord] + return CpPolar(data, build(data.cp_upper), build(data.cp_lower)) +end + +""" + CpData(polar::CpPolar) -> CpData + +The raw samples underlying a [`CpPolar`](@ref) (strips the interpolants). +""" +CpData(polar::CpPolar) = polar.data + +""" + read_cp_data(path) -> Union{Nothing, CpData} + +Load a section surface-pressure table from a single `cp.csv`; returns `nothing` if +`path` does not exist. Header: `alpha, delta, up@…, lo@…`. `alpha`/`delta` +are in degrees (converted to radians); `chord_x`/`n_chord` come from the `@` +column headers (upper and lower must share the same slices). Each row is one +`(alpha, delta)` point; the rows must form a full `alpha × delta` grid. +""" +function read_cp_data(path::AbstractString) + isfile(path) || return nothing + lines = readlines(String(path)) + header = strip.(split(lines[1], ',')) + xof(prefix) = [parse(Float64, String(h[(length(prefix) + 1):end])) + for h in header if startswith(h, prefix)] + chord_x = xof("up@") + chord_x == xof("lo@") || + throw(ArgumentError("cp.csv upper/lower chord slices differ: $path")) + n_chord = length(chord_x) + n_chord > 0 || throw(ArgumentError("cp.csv has no up@/lo@ columns: $path")) + + rows = [strip.(split(l, ',')) for l in lines[2:end] if !isempty(strip(l))] + alphas = [deg2rad(parse(Float64, String(r[1]))) for r in rows] + deltas = [deg2rad(parse(Float64, String(r[2]))) for r in rows] + alpha_range = sort(unique(alphas)) + delta_range = sort(unique(deltas)) + length(rows) == length(alpha_range) * length(delta_range) || + throw(ArgumentError("cp.csv rows do not form a full alpha × delta grid: $path")) + + cp_upper = fill(NaN, n_chord, length(alpha_range), length(delta_range)) + cp_lower = fill(NaN, n_chord, length(alpha_range), length(delta_range)) + for (k, r) in enumerate(rows) + length(r) == 2 + 2n_chord || + throw(ArgumentError("cp.csv row $(k) has wrong column count: $path")) + ia = searchsortedfirst(alpha_range, alphas[k]) + jd = searchsortedfirst(delta_range, deltas[k]) + vals = parse.(Float64, String.(r[3:end])) + cp_upper[:, ia, jd] .= vals[1:n_chord] + cp_lower[:, ia, jd] .= vals[(n_chord + 1):2n_chord] + end + return CpData(n_chord, chord_x, alpha_range, delta_range, cp_upper, cp_lower) +end + +""" + write_cp_data(path, data::CpData) -> path + +Write a [`CpData`](@ref) to `path` as a `cp.csv` in the [`read_cp_data`](@ref) +format: header `alpha, delta, up@…, lo@…`, one row per `(alpha, delta)` +with `alpha`/`delta` in degrees. +""" +function write_cp_data(path::AbstractString, data::CpData) + xhdr(prefix) = [string(prefix, round(x; digits=5)) for x in data.chord_x] + header = ["alpha"; "delta"; xhdr("up@"); xhdr("lo@")] + open(String(path), "w") do io + println(io, join(header, ",")) + for (jd, delta) in enumerate(data.delta_range), + (ia, alpha) in enumerate(data.alpha_range) + row = [string(round(rad2deg(alpha); digits=6)), + string(round(rad2deg(delta); digits=6))] + append!(row, string.(data.cp_upper[:, ia, jd])) + append!(row, string.(data.cp_lower[:, ia, jd])) + println(io, join(row, ",")) + end + end + return path +end + +""" + cp_distribution(polar::CpPolar, alpha, delta) -> (cp_upper, cp_lower) + +Upper and lower surface `Cp` at every chord slice for `alpha` and `delta` (radians). +""" +function cp_distribution(polar::CpPolar, alpha, delta) + return ([itp(alpha, delta) for itp in polar.cp_upper_interp], + [itp(alpha, delta) for itp in polar.cp_lower_interp]) +end + +""" + delta_cp(polar::CpPolar, alpha, delta) -> Vector{Float64} + +Chordwise load `ΔCp = Cp_lower - Cp_upper` at every chord slice. +""" +function delta_cp(polar::CpPolar, alpha, delta) + upper, lower = cp_distribution(polar, alpha, delta) + return lower .- upper +end diff --git a/src/cp_types.jl b/src/cp_types.jl new file mode 100644 index 00000000..c690718c --- /dev/null +++ b/src/cp_types.jl @@ -0,0 +1,38 @@ +""" + CpData + +Raw chord-slice surface-pressure samples for one 2D section (no interpolants) — the +CSV/section-level counterpart of [`CpPolar`](@ref). Sampled at `n_chord` **vertical +chord slices** `chord_x` (x/c), over angle of attack `alpha_range` and trailing-edge +deflection `delta_range` (both radians). + +Fields: +- `n_chord`, `chord_x`: number and x/c of the chord slices. +- `alpha_range`, `delta_range`: grid axes (radians). +- `cp_upper`, `cp_lower`: samples, `n_chord × n_alpha × n_delta`. +""" +struct CpData + n_chord::Int + chord_x::Vector{Float64} + alpha_range::Vector{Float64} + delta_range::Vector{Float64} + cp_upper::Array{Float64,3} + cp_lower::Array{Float64,3} +end + +""" + CpPolar + +Interpolatable surface-pressure table for a 2D section: a [`CpData`](@ref) plus one +`cp(alpha, delta)` interpolant per chord slice for each surface. `ΔCp = Cp_lower - +Cp_upper` is the chordwise load. Build one with `CpPolar(::CpData)`. + +Fields: +- `data`: the underlying [`CpData`](@ref). +- `cp_upper_interp`, `cp_lower_interp`: one `cp(alpha, delta)` interpolant per slice. +""" +struct CpPolar{I} + data::CpData + cp_upper_interp::Vector{I} + cp_lower_interp::Vector{I} +end diff --git a/src/panel.jl b/src/panel.jl index 69973313..a52404e9 100644 --- a/src/panel.jl +++ b/src/panel.jl @@ -28,6 +28,7 @@ Represents a panel in a vortex step method simulation. All points and vectors ar - cl_interp::Union{Nothing, I1, I2} = nothing - cd_interp::Union{Nothing, I1, I2} = nothing - cm_interp::Union{Nothing, I1, I2} = nothing +- cp_polar::Union{Nothing, CpPolar{I6}} = nothing: optional surface-pressure table, see [CpPolar](@ref) - `control_point`::Vector{MVec3}: Panel control point - `bound_point_1`::Vector{MVec3}: First bound point - `bound_point_2`::Vector{MVec3}: Second bound point @@ -58,6 +59,7 @@ Represents a panel in a vortex step method simulation. All points and vectors ar cl_interp::Union{Nothing, I1, I2, I3, I4} = nothing cd_interp::Union{Nothing, I1, I2, I3, I4, I5, I6} = nothing cm_interp::Union{Nothing, I1, I2, I3, I4} = nothing + cp_polar::Union{Nothing, CpPolar{I6}} = nothing aero_center::MVector{3, T} = zeros(MVector{3, T}) control_point::MVector{3, T} = zeros(MVector{3, T}) bound_point_1::MVector{3, T} = zeros(MVector{3, T}) @@ -133,8 +135,14 @@ function init_aero!( throw(ArgumentError("Both sections must have the same aero model, not $(panel.aero_model) and $aero_model_2")) end - if panel.aero_model == LEI_AIRFOIL_BREUKELS - panel.cl_coeffs, panel.cd_coeffs, panel.cm_coeffs = compute_lei_coeffs(section_1, section_2) + if panel.aero_model == POLY + c1 = section_1.aero_data + c2 = section_2.aero_data + (c1 isa NTuple{3, Vector{Float64}} && c2 isa NTuple{3, Vector{Float64}}) || + throw(ArgumentError("POLY requires aero_data = (cl_coeffs, cd_coeffs, cm_coeffs).")) + panel.cl_coeffs = (c1[1] .+ c2[1]) ./ 2 + panel.cd_coeffs = (c1[2] .+ c2[2]) ./ 2 + panel.cm_coeffs = (c1[3] .+ c2[3]) ./ 2 elseif panel.aero_model in (POLAR_VECTORS, POLAR_MATRICES) if remove_nan @@ -222,6 +230,17 @@ function init_aero!( elseif !(panel.aero_model == INVISCID) throw(ArgumentError("Unsupported aero model: $(panel.aero_model)")) end + + if section_1.cp_data !== nothing + cp_1 = section_1.cp_data + cp_2 = section_2.cp_data + cp_up = (cp_1.cp_upper .+ cp_2.cp_upper) ./ 2 + cp_low = (cp_1.cp_lower .+ cp_2.cp_lower) ./ 2 + panel.cp_polar = CpPolar(CpData(cp_1.n_chord, cp_1.chord_x, + cp_1.alpha_range, cp_1.delta_range, cp_up, cp_low)) + else + panel.cp_polar = nothing + end end function reinit!( @@ -275,76 +294,6 @@ function calculate_relative_alpha_and_relative_velocity( return alpha, relative_velocity end -""" - compute_lei_coeffs(section_1::Section, section_2::Section) - -Compute lift, drag and moment coefficients for Lei airfoil using Breukels model. -""" -function compute_lei_coeffs(section_1::Section, section_2::Section) - section_1.aero_data isa NTuple{2, Float64} || - throw(ArgumentError("LEI_AIRFOIL_BREUKELS requires aero_data = (tube_diameter, camber).")) - section_2.aero_data isa NTuple{2, Float64} || - throw(ArgumentError("LEI_AIRFOIL_BREUKELS requires aero_data = (tube_diameter, camber).")) - - # Average tube diameter and camber from both sections - t1, k1 = section_1.aero_data::NTuple{2, Float64} - t2, k2 = section_2.aero_data::NTuple{2, Float64} - t = (t1 + t2) / 2 - k = (k1 + k2) / 2 - - # Lift coefficient constants - C = Dict( - 20 => -0.008011, 21 => -0.000336, 22 => 0.000992, - 23 => 0.013936, 24 => -0.003838, 25 => -0.000161, - 26 => 0.001243, 27 => -0.009288, 28 => -0.002124, - 29 => 0.012267, 30 => -0.002398, 31 => -0.000274, - 32 => 0.0, 33 => 0.0, 34 => 0.0, - 35 => -3.371000, 36 => 0.858039, 37 => 0.141600, - 38 => 7.201140, 39 => -0.676007, 40 => 0.806629, - 41 => 0.170454, 42 => -0.390563, 43 => 0.101966 - ) - - # Compute S values - S = Dict{Int64,Float64}() - S[9] = C[20]*t^2 + C[21]*t + C[22] - S[10] = C[23]*t^2 + C[24]*t + C[25] - S[11] = C[26]*t^2 + C[27]*t + C[28] - S[12] = C[29]*t^2 + C[30]*t + C[31] - S[13] = C[32]*t^2 + C[33]*t + C[34] - S[14] = C[35]*t^2 + C[36]*t + C[37] - S[15] = C[38]*t^2 + C[39]*t + C[40] - S[16] = C[41]*t^2 + C[42]*t + C[43] - - # Compute lambda values for cl - λ = [ - S[9]*k + S[10], - S[11]*k + S[12], - S[13]*k + S[14], - S[15]*k + S[16] - ] - - # Drag coefficient constants and computation - cd_coeffs = [ - ((0.546094*t + 0.022247)*k^2 + - (-0.071462*t - 0.006527)*k + - (0.002733*t + 0.000686)), - 0.0, - ((0.123685*t + 0.143755)*k + - (0.495159*t^2 - 0.105362*t + 0.033468)) - ] - - # Moment coefficient constants and computation - cm_coeffs = [ - ((-0.284793*t - 0.026199)*k + - (-0.024060*t + 0.000559)), - 0.0, - ((-1.787703*t + 0.352443)*k + - (-0.839323*t + 0.137932)) - ] - - return λ, cd_coeffs, cm_coeffs -end - """ calculate_relative_alpha_and_velocity(panel::Panel, induced_velocity) @@ -373,7 +322,7 @@ Calculate lift coefficient for given angle of attack. function calculate_cl(panel::Panel{Tp}, alpha::Ta) where {Tp, Ta} R = promote_type(Tp, Ta) isnan(alpha) && return R(NaN) - if panel.aero_model == LEI_AIRFOIL_BREUKELS + if panel.aero_model == POLY cl = evalpoly(rad2deg(alpha), reverse(panel.cl_coeffs)) if abs(alpha) > (π/9) cl = 2 * cos(alpha) * sin(alpha)^2 @@ -403,7 +352,7 @@ Calculate the drag coefficient for the given angle of attack. function calculate_cd(panel::Panel{Tp}, alpha::Ta) where {Tp, Ta} R = promote_type(Tp, Ta) isnan(alpha) && return R(NaN) - if panel.aero_model == LEI_AIRFOIL_BREUKELS + if panel.aero_model == POLY if abs(alpha) > (π/9) # Outside ±20 degrees return R(2 * sin(alpha)^3) end @@ -430,7 +379,7 @@ Calculate the pitching-moment coefficient for the given angle of attack. function calculate_cm(panel::Panel{Tp}, alpha::Ta) where {Tp, Ta} R = promote_type(Tp, Ta) isnan(alpha) && return R(NaN) - if panel.aero_model == LEI_AIRFOIL_BREUKELS + if panel.aero_model == POLY return R(evalpoly(rad2deg(alpha), reverse(panel.cm_coeffs))) elseif panel.aero_model == POLAR_VECTORS cm_interp = panel.cm_interp diff --git a/src/polars.jl b/src/polars.jl index 56d333a4..d90e1a74 100644 --- a/src/polars.jl +++ b/src/polars.jl @@ -1,248 +1,4 @@ -const SPEED_OF_SOUND = 343 # [m/s] at 20 °C, see: https://en.wikipedia.org/wiki/Speed_of_sound -const KINEMATIC_VISCOSITY = 1.460e-5 # [m²/s] for the atmosphere at sea level. - # see: https://en.wikipedia.org/wiki/Reynolds_number - -""" - normalize_foil!(x, y) - -Scale airfoil coordinates to unit chord length, with x ∈ [0,1]. -""" -function normalize_foil!(x, y) - x_min = minimum(x) - x_max = maximum(x) - for i in eachindex(x) - x[i] = (x[i] - x_min) / (x_max - x_min) - y[i] = (y[i] - x_min) / (x_max - x_min) - end -end - -""" - turn_trailing_edge!(angle, x, y, lower_turn, upper_turn, crease_frac) - -Deflect airfoil trailing edge by rotating coordinates behind crease line. -Positive angle deflects downward. -""" -function turn_trailing_edge!(angle, x, y, lower_turn, upper_turn, crease_frac) - turn_distance = upper_turn - lower_turn - smooth_idx = [] - rm_idx = [] - - sign = angle > 0 ? 1 : -1 - y_turn = angle > 0 ? upper_turn : lower_turn - for i in eachindex(x) - if crease_frac - turn_distance < x[i] < crease_frac + turn_distance && sign * y[i] > 0 - append!(smooth_idx, i) - elseif sign * y[i] < 0 && crease_frac > x[i] > crease_frac - turn_distance - append!(rm_idx, i) - end - if x[i] > crease_frac - x_rel = x[i] - crease_frac - y_rel = y[i] - y_turn - x[i] = crease_frac + x_rel * cos(angle) + y_rel * sin(angle) - y[i] = y_turn - x_rel * sin(angle) + y_rel * cos(angle) - if angle > 0 && x[i] < crease_frac - turn_distance/2 && y[i] > lower_turn - append!(rm_idx, i) - elseif angle < 0 && x[i] < crease_frac - turn_distance/2 && y[i] < upper_turn - append!(rm_idx, i) - end - end - end - - #TODO: lower and upper is slightly off because of smoothing - lower_i, upper_i = minimum(smooth_idx), maximum(smooth_idx) - for i in smooth_idx - window = min(i - lower_i + 1, upper_i - i + 1) - x[i] = mean(x[i-window:i+window]) - end - deleteat!(x, rm_idx) - deleteat!(y, rm_idx) - nothing -end - -""" - solve_alpha!(cls, cds, cms, alpha_range, alpha_idxs, delta, re, x_, y_, - lower, upper, kite_speed, speed_of_sound, crease_frac) - -Calculate aerodynamic coefficients for specified angles of attack using XFoil. -Results are stored in pre-allocated cls, cds, cms vectors. -""" -function solve_alpha!(cls, cds, cms, alpha_range, alpha_idxs, delta, re, x_, y_, lower, upper, kite_speed, speed_of_sound, crease_frac) - x = deepcopy(x_) - y = deepcopy(y_) - turn_trailing_edge!(delta, x, y, lower, upper, crease_frac) - Xfoil.set_coordinates(x, y) - Xfoil.pane(npan=140) - reinit = true - for (alpha, alpha_idx) in zip(alpha_range, alpha_idxs) - # Solve for the given angle of attack - cl, cd, _, cm, converged = Xfoil.solve_alpha(rad2deg(alpha), re; iter=50, reinit=reinit, mach=kite_speed/speed_of_sound, xtrip=(0.05, 0.05)) - reinit = false - if converged - cls[alpha_idx] = cl - cds[alpha_idx] = cd - cms[alpha_idx] = cm - end - end - return nothing -end - -""" - run_solve_alpha(alpha_range, delta, re, x_, y_, lower, upper, kite_speed, - speed_of_sound, crease_frac) -> (cls, cds, cms) - -Run XFoil analysis for full alpha range, handling positive and negative angles separately. -""" -function run_solve_alpha(alpha_range, delta, re, x_, y_, lower, upper, kite_speed, speed_of_sound, crease_frac) - @info "solving alpha with trailing edge angle: $(rad2deg(delta)) degrees" - cls = Float64[NaN for _ in alpha_range] - cds = Float64[NaN for _ in alpha_range] - cms = Float64[NaN for _ in alpha_range] - neg_idxs = sort(findall(alpha_range .< 0.0), rev=true) - neg_alpha_range = alpha_range[neg_idxs] - pos_idxs = sort(findall(alpha_range .>= 0.0)) - pos_alpha_range = alpha_range[pos_idxs] - - solve_alpha!(cls, cds, cms, neg_alpha_range, neg_idxs, delta, - re, x_, y_, lower, upper, kite_speed, speed_of_sound, crease_frac) - solve_alpha!(cls, cds, cms, pos_alpha_range, pos_idxs, delta, - re, x_, y_, lower, upper, kite_speed, speed_of_sound, crease_frac) - return cls, cds, cms -end - -""" - get_lower_upper(x, y, crease_frac) -> (lower, upper) - -Find y-coordinates where upper/lower surfaces intersect the hinge line. -""" -function get_lower_upper(x, y, crease_frac) - lower_trailing_edge = 0.0 - upper_trailing_edge = 0.0 - min_lower_distance = Inf - min_upper_distance = Inf - for (xi, yi) in zip(x, y) - if yi < 0 - lower_distance = abs(xi - crease_frac) - if lower_distance < min_lower_distance - min_lower_distance = lower_distance - lower_trailing_edge = yi - end - else - upper_distance = abs(xi - crease_frac) - if upper_distance < min_upper_distance - min_upper_distance = upper_distance - upper_trailing_edge = yi - end - end - end - return lower_trailing_edge, upper_trailing_edge -end - -""" - create_polars(; dat_path, cl_polar_path, cd_polar_path, cm_polar_path, wind_vel, area, - width, crease_frac, alpha_range, delta_range, remove_nan=true) - -Generate complete aerodynamic coefficient tables for an airfoil with trailing edge deflection. - -This function: -1. Reads airfoil coordinates from a .dat file -2. Normalizes the coordinates to unit chord -3. Computes Reynolds number based on normal flight conditions -4. Generates coefficient matrices using XFoil for combinations of: - - Angles of attack (alpha_range) - - Trailing edge deflections (delta_range) -5. Optionally interpolates any NaN values from failed computations -6. Saves results to CSV files - -# Arguments -- `dat_path`: Path to airfoil coordinate file -- `cl_polar_path`: Output path for lift coefficient CSV -- `cd_polar_path`: Output path for drag coefficient CSV -- `cm_polar_path`: Output path for moment coefficient CSV -- `wind_vel`: Reference velocity (m/s) -- `area`: Wing area (m²) -- `width`: Wing span (m) -- `crease_frac`: Chordwise location of hinge line (0-1) -- `alpha_range`: Vector of angles of attack to analyze (radians) -- `delta_range`: Vector of trailing edge deflections to analyze (radians) -- `remove_nan`: Whether to interpolate NaN values in results (default: true) - -# Outputs -Creates three CSV files containing lift, drag, and moment coefficient matrices. -Each file includes headers with angle labels and uses degrees for readability. -""" -function create_polars(; dat_path, cl_polar_path, cd_polar_path, cm_polar_path, wind_vel, area, - width, crease_frac, alpha_range, delta_range, remove_nan=true -) - @info "Creating polars. This can take several minutes." - tic() - - cl_matrix = zeros(length(alpha_range), length(delta_range)) - cd_matrix = zeros(length(alpha_range), length(delta_range)) - cm_matrix = zeros(length(alpha_range), length(delta_range)) - - kite_speed = wind_vel - chord_length = area / width - local reynolds_number = kite_speed * chord_length / KINEMATIC_VISCOSITY # https://en.wikipedia.org/wiki/Reynolds_number - - # Read airfoil coordinates from a file. - local x = Float64[] - local y = Float64[] - f = open(dat_path, "r") - try - for line in eachline(f) - entries = split(chomp(line)) - try - push!(x, parse(Float64, entries[1])) - push!(y, parse(Float64, entries[2])) - catch err - if err isa ArgumentError - println(entries) - else - rethrow(err) - end - end - end - finally - close(f) - end - normalize_foil!(x, y) - Xfoil.set_coordinates(x, y) - x, y = Xfoil.pane(npan=140) - lower, upper = get_lower_upper(x, y, crease_frac) - - for j in eachindex(delta_range) - cl_matrix[:, j], cd_matrix[:, j], cm_matrix[:, j] = run_solve_alpha(alpha_range, delta_range[j], - reynolds_number, x, y, lower, upper, kite_speed, SPEED_OF_SOUND, crease_frac) - end - cl_matrix = Matrix{Float64}(cl_matrix) - cd_matrix = Matrix{Float64}(cd_matrix) - cm_matrix = Matrix{Float64}(cm_matrix) - - println("Generated lift matrix:") - display(cl_matrix) - println("Generated drag matrix:") - display(cd_matrix) - println("Generated moment matrix:") - display(cm_matrix) - - @info "Relative trailing_edge height: $(upper - lower)" - @info "Reynolds number for flying speed of $kite_speed is $reynolds_number" - - if remove_nan - interpolate_matrix_nans!(cl_matrix) - interpolate_matrix_nans!(cd_matrix) - interpolate_matrix_nans!(cm_matrix) - end - - write_aero_matrix(cl_polar_path, cl_matrix, alpha_range, delta_range, "C_l") - write_aero_matrix(cd_polar_path, cd_matrix, alpha_range, delta_range, "C_d") - write_aero_matrix(cm_polar_path, cm_matrix, alpha_range, delta_range, "C_m") - - toc() -end - - """ interpolate_matrix_nans!(matrix::Matrix{Float64}; prn=true) diff --git a/src/solver.jl b/src/solver.jl index ebf021e9..5ad73422 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -49,6 +49,9 @@ Struct for storing the solution of the [solve!](@ref) function. Must contain all cl_dist::Vector{T} = zeros(T, P) cd_dist::Vector{T} = zeros(T, P) cm_dist::Vector{T} = zeros(T, P) + cp_chord_x::Vector{T} = T[] + cp_upper_dist::Matrix{T} = zeros(T, 0, P) + cp_lower_dist::Matrix{T} = zeros(T, 0, P) lift_dist::Vector{T} = zeros(T, P) drag_dist::Vector{T} = zeros(T, P) panel_moment_dist::Vector{T} = zeros(T, P) @@ -242,6 +245,41 @@ function solve!(solver::Solver{P, U, T}, body_aero::BodyAerodynamics, gamma_dist return calc_forces!(solver, body_aero; reference_point, moment_frac) end +""" + prepare_cp_output!(sol::VSMSolution, panels) + +Size and reset the surface-pressure output of `sol` for the current `panels`. When any +panel carries a `cp_polar`, allocate `n_chord × n_panels` matrices filled with `NaN` +and copy the chord slices; otherwise leave the Cp output empty. +""" +function prepare_cp_output!(sol::VSMSolution{P, U, T}, panels) where {P, U, T} + idx = findfirst(p -> p.cp_polar !== nothing, panels) + if idx === nothing + isempty(sol.cp_chord_x) || (sol.cp_chord_x = T[]) + size(sol.cp_upper_dist, 1) == 0 || + (sol.cp_upper_dist = zeros(T, 0, P); sol.cp_lower_dist = zeros(T, 0, P)) + return nothing + end + n_chord = panels[idx].cp_polar.data.n_chord + if size(sol.cp_upper_dist) != (n_chord, P) + sol.cp_upper_dist = fill(T(NaN), n_chord, P) + sol.cp_lower_dist = fill(T(NaN), n_chord, P) + else + fill!(sol.cp_upper_dist, T(NaN)) + fill!(sol.cp_lower_dist, T(NaN)) + end + sol.cp_chord_x = T.(panels[idx].cp_polar.data.chord_x) + return nothing +end + +""" + delta_cp(sol::VSMSolution) -> Matrix + +Chordwise load `ΔCp = Cp_lower - Cp_upper` per chord slice (rows) and panel (columns) +from the last [`solve!`](@ref). Empty when the wing carried no Cp table. +""" +delta_cp(sol::VSMSolution) = sol.cp_lower_dist .- sol.cp_upper_dist + """ calc_forces!(solver::Solver, body_aero::BodyAerodynamics; reference_point=solver.reference_point, moment_frac=0.1) @@ -272,11 +310,18 @@ function calc_forces!(solver::Solver{P, U, T}, body_aero::BodyAerodynamics; density = solver.density aerodynamic_model_type = solver.aerodynamic_model_type + prepare_cp_output!(solver.sol, panels) + # Calculate coefficients for each panel for (i, panel) in enumerate(panels) # zero bytes cl_dist[i] = calculate_cl(panel, alpha_dist[i]) cd_dist[i], cm_dist[i] = calculate_cd_cm(panel, alpha_dist[i]) width_dist[i] = panel.width + if panel.cp_polar !== nothing + up, low = cp_distribution(panel.cp_polar, alpha_dist[i], panel.delta) + solver.sol.cp_upper_dist[:, i] .= up + solver.sol.cp_lower_dist[:, i] .= low + end # Geometric AoA using panel-local axes and prescribed # freestream — scalar ops to avoid allocations @@ -1024,6 +1069,7 @@ function _section_with_eltype(section::Section, ::Type{TD}) where TD MVector{3, TD}(section.TE_point), section.aero_model, section.aero_data, + section.cp_data, ) end diff --git a/src/wing_geometry.jl b/src/wing_geometry.jl index c572f337..cd761a35 100644 --- a/src/wing_geometry.jl +++ b/src/wing_geometry.jl @@ -8,17 +8,19 @@ Represents a wing section with leading edge, trailing edge, and aerodynamic prop - `TE_point::MVector{3, T}`: Trailing edge point coordinates - `aero_model::AeroModel`: [AeroModel](@ref) - `aero_data::AeroData`: See: [AeroData](@ref) +- `cp_data::Union{Nothing, CpData}`: optional surface-pressure table, see [CpData](@ref) """ mutable struct Section{T} LE_point::MVector{3, T} TE_point::MVector{3, T} aero_model::AeroModel aero_data::AeroData + cp_data::Union{Nothing, CpData} end Section{T}(; LE_point=zeros(MVector{3, T}), TE_point=zeros(MVector{3, T}), - aero_model=INVISCID, aero_data=nothing) where {T} = - Section{T}(LE_point, TE_point, aero_model, aero_data) + aero_model=INVISCID, aero_data=nothing, cp_data=nothing) where {T} = + Section{T}(LE_point, TE_point, aero_model, aero_data, cp_data) Section() = Section{Float64}() @@ -37,11 +39,13 @@ and aerodynamic model. - `Section`: A new section with the specified parameters and no aerodynamic data """ function Section(LE_point, TE_point, aero_model) - return Section{Float64}(MVector{3,Float64}(LE_point), MVector{3,Float64}(TE_point), aero_model, nothing) + return Section{Float64}(MVector{3,Float64}(LE_point), MVector{3,Float64}(TE_point), + aero_model, nothing, nothing) end -function Section(LE_point, TE_point, aero_model, aero_data) - return Section{Float64}(MVector{3,Float64}(LE_point), MVector{3,Float64}(TE_point), aero_model, aero_data) +function Section(LE_point, TE_point, aero_model, aero_data, cp_data=nothing) + return Section{Float64}(MVector{3,Float64}(LE_point), MVector{3,Float64}(TE_point), + aero_model, aero_data, cp_data) end """ @@ -51,7 +55,8 @@ Function to update a [Section](@ref) in place. """ @inline _section_sort_key(s::Section) = s.LE_point[2] -function reinit!(section::Section, LE_point, TE_point, aero_model=nothing, aero_data=nothing) +function reinit!(section::Section, LE_point, TE_point, aero_model=nothing, + aero_data=nothing, cp_data=nothing) section.LE_point .= LE_point section.TE_point .= TE_point (!isnothing(aero_model)) && (section.aero_model = aero_model) @@ -64,6 +69,7 @@ function reinit!(section::Section, LE_point, TE_point, aero_model=nothing, aero_ section.aero_data .= aero_data end end + (!isnothing(cp_data)) && (section.cp_data = cp_data) nothing end @@ -74,9 +80,31 @@ function reinit!(refined_section::Section{Tr}, section::Section) where {Tr} section.TE_point, section.aero_model, section.aero_data, + section.cp_data, ) end +""" + validate_cp_sections(sections) + +Enforce the all-or-none Cp rule and a uniform chord resolution: either every section +in `sections` carries [`CpData`](@ref) or none does, and all present tables share the +same `chord_x` slices. Throws `ArgumentError` on a violation. +""" +function validate_cp_sections(sections) + have = [!isnothing(s.cp_data) for s in sections] + all(have) || !any(have) || throw(ArgumentError( + "Cp data must be present on all sections or none " * + "(found $(count(have))/$(length(have))).")) + any(have) || return nothing + reference = sections[findfirst(have)].cp_data.chord_x + for s in sections + s.cp_data.chord_x == reference || + throw(ArgumentError("All sections must share the same Cp chord_x slices.")) + end + return nothing +end + """ PanelProperties @@ -230,6 +258,23 @@ Represents a wing composed of multiple sections with aerodynamic properties. - `area_interp::Union{Nothing, Extrapolation}`: Area interpolation - `cache::Vector{PreallocationTools.LazyBufferCache{typeof(identity), typeof(identity)}}`: Preallocated buffers +# Deformation Fields (optional, for deformable wings) +- `non_deformed_sections::Vector{Section}`: Original undeformed sections +- `theta_dist::Vector{Float64}`: Panel twist angle distribution +- `delta_dist::Vector{Float64}`: Trailing edge deflection distribution + +# Physical Properties (optional, for OBJ-based wings) +- `mass::Float64`: Total wing mass in kg (0.0 if not applicable) +- `gamma_tip::Float64`: Angular extent from center to wing tip (0.0 if not applicable) +- `inertia_tensor::Matrix{Float64}`: 3x3 inertia tensor (empty if not applicable) +- `T_cad_body::MVec3`: Translation from CAD to body frame (zeros if not applicable) +- `R_cad_body::MMat3`: Rotation from CAD to body frame (identity if not applicable) +- `radius::Float64`: Wing curvature radius (0.0 if not applicable) +- `le_interp::Union{Nothing, NTuple{3, Extrapolation}}`: Leading edge interpolation +- `te_interp::Union{Nothing, NTuple{3, Extrapolation}}`: Trailing edge interpolation +- `area_interp::Union{Nothing, Extrapolation}`: Area interpolation +- `cache::Vector{PreallocationTools.LazyBufferCache{typeof(identity), typeof(identity)}}`: Preallocated buffers + """ mutable struct Wing{P, T} <: AbstractWing{T} n_panels::Int16 @@ -656,8 +701,8 @@ end throw(ArgumentError("POLAR_MATRICES requires aero_data = (alpha, delta, cl, cd, cm).")) """ - add_section!(wing::Wing, LE_point::PosVector, TE_point::PosVector, - aero_model, aero_data::AeroData=nothing) + add_section!(wing::Wing, LE_point::PosVector, TE_point::PosVector, + aero_model, aero_data::AeroData=nothing, cp_data=nothing) Add a new section to the wing. @@ -666,16 +711,19 @@ Add a new section to the wing. - LE_point::PosVector: [PosVector](@ref) of the point on the side of the leading edge - TE_point::PosVector: [PosVector](@ref) of the point on the side of the trailing edge - `aero_model`::AeroModel: [AeroModel](@ref) -- `aero_data`::AeroData: See [AeroData](@ref) +- `aero_data`::AeroData: See [AeroData](@ref) +- `cp_data`::Union{Nothing, CpData}: optional surface-pressure table, see [CpData](@ref) """ -function add_section!(wing::Wing{P, T}, LE_point, - TE_point, aero_model::AeroModel, aero_data::AeroData=nothing) where {P, T} +function add_section!(wing::Wing{P, T}, LE_point, TE_point, aero_model::AeroModel, + aero_data::AeroData=nothing, + cp_data::Union{Nothing, CpData}=nothing) where {P, T} if aero_model == POLAR_VECTORS && wing.remove_nan aero_data = remove_vector_nans(aero_data) elseif aero_model == POLAR_MATRICES && wing.remove_nan interpolate_polar_matrix_nans!(aero_data) end - push!(wing.unrefined_sections, Section{T}(MVector{3,T}(LE_point), MVector{3,T}(TE_point), aero_model, aero_data)) + push!(wing.unrefined_sections, Section{T}(MVector{3,T}(LE_point), + MVector{3,T}(TE_point), aero_model, aero_data, cp_data)) wing.n_unrefined_sections = Int16(length(wing.unrefined_sections)) return nothing end @@ -1078,6 +1126,31 @@ function compute_refined_section_interpolation!(wing::AbstractWing{T}) where {T} wing.refined_section_left_idx[n_sections] = Int16(n_unref - 1) wing.refined_section_weight[n_sections] = zero(T) + interpolate_cp_to_refined!(wing) + return nothing +end + +""" + interpolate_cp_to_refined!(wing) + +Set each refined section's [`CpData`](@ref) by spanwise-interpolating the unrefined +sections' Cp tables using the refined→unrefined mapping (`refined_section_left_idx`, +`refined_section_weight`). No-op when the unrefined sections carry no Cp. +""" +function interpolate_cp_to_refined!(wing::AbstractWing) + unref = wing.unrefined_sections + all(s -> isnothing(s.cp_data), unref) && return nothing + for i in eachindex(wing.refined_sections) + left = Int(wing.refined_section_left_idx[i]) + weight = Float64(wing.refined_section_weight[i]) + cp_l = unref[left].cp_data + cp_r = unref[left + 1].cp_data + (isnothing(cp_l) || isnothing(cp_r)) && continue + cp_up = weight .* cp_l.cp_upper .+ (1 - weight) .* cp_r.cp_upper + cp_low = weight .* cp_l.cp_lower .+ (1 - weight) .* cp_r.cp_lower + wing.refined_sections[i].cp_data = CpData(cp_l.n_chord, cp_l.chord_x, + cp_l.alpha_range, cp_l.delta_range, cp_up, cp_low) + end return nothing end @@ -1176,26 +1249,17 @@ function calculate_new_aero_data(aero_model, return (alpha_left, delta_left, CL_data, CD_data, CM_data) - elseif isequal(model_type, LEI_AIRFOIL_BREUKELS) + elseif isequal(model_type, POLY) data_left = aero_data[section_index] data_right = aero_data[section_index + 1] - (data_left isa NTuple{2, Float64}) || - throw(ArgumentError("Provide LEI aero data as (tube_diameter, chamber_height).")) - (data_right isa NTuple{2, Float64}) || - throw(ArgumentError("Provide LEI aero data as (tube_diameter, chamber_height).")) - - tube_diameter_left = data_left[1] - tube_diameter_right = data_right[1] - tube_diameter_i = tube_diameter_left * left_weight + tube_diameter_right * right_weight - - chamber_height_left = data_left[2] - chamber_height_right = data_right[2] - chamber_height_i = chamber_height_left * left_weight + chamber_height_right * right_weight - - @debug "Interpolation weights" left_weight right_weight - @debug "Interpolated parameters" tube_diameter_i chamber_height_i - - return (tube_diameter_i, chamber_height_i) + (data_left isa NTuple{3, Vector{Float64}} && + data_right isa NTuple{3, Vector{Float64}}) || + throw(ArgumentError("POLY requires aero_data = (cl_coeffs, cd_coeffs, cm_coeffs).")) + return ( + data_left[1] .* left_weight .+ data_right[1] .* right_weight, + data_left[2] .* left_weight .+ data_right[2] .* right_weight, + data_left[3] .* left_weight .+ data_right[3] .* right_weight, + ) else throw(ArgumentError("Unsupported aero model: $(model_type)")) end diff --git a/src/yaml_geometry.jl b/src/yaml_geometry.jl index 45e52a1e..46fafa54 100644 --- a/src/yaml_geometry.jl +++ b/src/yaml_geometry.jl @@ -1,6 +1,11 @@ # Data structures for YAML wing geometry @with_kw struct WingAirfoilInfo csv_file_path::String + dat_file::String = "" + cp_file_path::String = "" + cl_file_path::String = "" + cd_file_path::String = "" + cm_file_path::String = "" end @with_kw struct WingSectionData @@ -148,6 +153,20 @@ function load_polar_data(csv_file_path::String) end end +""" + load_matrix_polar_data(cl_path, cd_path, cm_path) -> (aero_data, POLAR_MATRICES) + +Read the three `(alpha × delta)` coefficient matrices (see [`read_aero_matrix`](@ref)) +and assemble the `POLAR_MATRICES` `aero_data = (alpha, delta, cl, cd, cm)`. +""" +function load_matrix_polar_data(cl_path::String, cd_path::String, cm_path::String) + cl_matrix, alpha, delta = read_aero_matrix(cl_path) + cd_matrix, _, _ = read_aero_matrix(cd_path) + cm_matrix, _, _ = read_aero_matrix(cm_path) + return (collect(alpha), collect(delta), cl_matrix, cd_matrix, cm_matrix), + POLAR_MATRICES +end + """ Wing(geometry_file::String; n_panels=20, spanwise_distribution=LINEAR, spanwise_direction=[0.0, 1.0, 0.0], remove_nan=true, @@ -203,7 +222,6 @@ function Wing( # Load YAML file following Uwe's suggestion data = YAML.load_file(geometry_file) - # Convert YAML data to our struct format # Convert wing sections wing_sections_data = data["wing_sections"] sections = WingSectionData[] @@ -223,25 +241,48 @@ function Wing( # Convert wing airfoils wing_airfoils_data = data["wing_airfoils"] airfoils = WingAirfoilData[] + airfoil_poly_map = Dict{Int64, NTuple{3, Vector{Float64}}}() + airfoil_type_map = Dict{Int64, String}() for row in wing_airfoils_data["data"] airfoil_dict = Dict(zip(wing_airfoils_data["headers"], row)) + airfoil_type_map[airfoil_dict["airfoil_id"]] = String(airfoil_dict["type"]) + info = airfoil_dict["info_dict"] + if haskey(info, "cl_coeffs") + airfoil_poly_map[airfoil_dict["airfoil_id"]] = ( + Float64.(info["cl_coeffs"]), Float64.(info["cd_coeffs"]), + Float64.(info["cm_coeffs"])) + end push!(airfoils, WingAirfoilData( airfoil_id = airfoil_dict["airfoil_id"], type = airfoil_dict["type"], - info_dict = WingAirfoilInfo(csv_file_path = get(airfoil_dict["info_dict"], "csv_file_path", "")) + info_dict = WingAirfoilInfo( + csv_file_path = get(airfoil_dict["info_dict"], "csv_file_path", ""), + dat_file = get(airfoil_dict["info_dict"], "dat_file", ""), + cp_file_path = get(airfoil_dict["info_dict"], "cp_file_path", ""), + cl_file_path = get(airfoil_dict["info_dict"], "cl_file_path", ""), + cd_file_path = get(airfoil_dict["info_dict"], "cd_file_path", ""), + cm_file_path = get(airfoil_dict["info_dict"], "cm_file_path", "")) )) end - + # Create CSV file mapping from airfoils airfoil_csv_map = Dict{Int64, String}() + airfoil_cp_map = Dict{Int64, String}() + airfoil_matrix_map = Dict{Int64, NTuple{3, String}}() for airfoil in airfoils if !isempty(airfoil.info_dict.csv_file_path) airfoil_csv_map[airfoil.airfoil_id] = airfoil.info_dict.csv_file_path end + if !isempty(airfoil.info_dict.cp_file_path) + airfoil_cp_map[airfoil.airfoil_id] = airfoil.info_dict.cp_file_path + end + if !isempty(airfoil.info_dict.cl_file_path) + airfoil_matrix_map[airfoil.airfoil_id] = (airfoil.info_dict.cl_file_path, + airfoil.info_dict.cd_file_path, airfoil.info_dict.cm_file_path) + end end - # Create Wing using the standard constructor - # n_unrefined_sections will be set automatically after sections are added + # n_unrefined_sections is set automatically as sections are added wing = Wing(n_panels; spanwise_distribution=spanwise_distribution, spanwise_direction=MVec3(spanwise_direction), @@ -256,19 +297,33 @@ function Wing( le_coord = [section.LE_x, section.LE_y, section.LE_z] te_coord = [section.TE_x, section.TE_y, section.TE_z] - # Load polar data and create section - csv_file_path = get(airfoil_csv_map, section.airfoil_id, "") - if !isempty(csv_file_path) && !isabspath(csv_file_path) - # NOTE: The spanwise direction is currently restricted to [0.0, 1.0, 0.0] (the global Y axis). - # This is required because downstream geometry and panel generation code assumes the spanwise axis is aligned with Y. - # If you need to support arbitrary spanwise directions, refactor the geometry logic accordingly. - csv_file_path = joinpath(dirname(geometry_file), csv_file_path) + base_dir = dirname(geometry_file) + resolve(p) = (!isempty(p) && !isabspath(p)) ? joinpath(base_dir, p) : p + + # Core accepts only resolved forms (poly/polars/inviscid); rich types resolve in AirfoilAero. + airfoil_type = get(airfoil_type_map, section.airfoil_id, "") + if haskey(airfoil_poly_map, section.airfoil_id) + aero_data = airfoil_poly_map[section.airfoil_id] + aero_model = POLY + elseif haskey(airfoil_matrix_map, section.airfoil_id) + cl_p, cd_p, cm_p = airfoil_matrix_map[section.airfoil_id] + aero_data, aero_model = load_matrix_polar_data( + resolve(cl_p), resolve(cd_p), resolve(cm_p)) + elseif airfoil_type in ("neuralfoil", "breukels_regression", "masure_regression") + throw(ArgumentError("airfoil_id $(section.airfoil_id) has unresolved " * + "type \"$airfoil_type\"; resolve it with AirfoilAero " * + "(resolve_aero_geometry) into polars/poly before loading.")) + else + csv_file_path = resolve(get(airfoil_csv_map, section.airfoil_id, "")) + aero_data, aero_model = load_polar_data(csv_file_path) end - aero_data, aero_model = load_polar_data(csv_file_path) + + cp_file_path = resolve(get(airfoil_cp_map, section.airfoil_id, "")) + cp_data = isempty(cp_file_path) ? nothing : read_cp_data(cp_file_path) prn && println("Section airfoil_id $(section.airfoil_id): Using $aero_model model") - add_section!(wing, le_coord, te_coord, aero_model, aero_data) + add_section!(wing, le_coord, te_coord, aero_model, aero_data, cp_data) end refine!(wing; sort_sections) @@ -342,16 +397,10 @@ function Wing(settings::VSMSettings; sort_sections::Bool=true) sort_sections ) elseif has_obj && has_dat - # Use ObjWing constructor (ObjWing doesn't sort sections internally) - ObjWing( - wing_settings.obj_file, - wing_settings.dat_file; - n_panels=wing_settings.n_panels, - spanwise_distribution=wing_settings.spanwise_panel_distribution, - spanwise_direction=wing_settings.spanwise_direction, - remove_nan=wing_settings.remove_nan, - use_prior_polar=wing_settings.use_prior_polar - ) + throw(ArgumentError( + "OBJ/DAT geometry is handled by the ObjAdapter package: convert to a " * + "standard YAML with ObjAdapter first, then load it via geometry_file." + )) else throw(ArgumentError( "WingSettings must specify either geometry_file or " * diff --git a/test/Project.toml b/test/Project.toml index e81a7223..bf917f39 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -1,10 +1,12 @@ [deps] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +AirfoilAero = "028acdb8-af45-4085-83da-edc09f4c5e4d" BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" ControlPlots = "23c2ee80-7a9e-4350-b264-8e670f12517c" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +ObjAdapter = "55e39422-45f7-4798-8632-36c195bd49aa" DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab" DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" @@ -24,6 +26,8 @@ YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" [sources] VortexStepMethod = {path = ".."} +AirfoilAero = {path = "../lib/AirfoilAero"} +ObjAdapter = {path = "../lib/ObjAdapter"} [compat] Aqua = "0.8" diff --git a/test/body_aerodynamics/test_results.jl b/test/body_aerodynamics/test_results.jl index f26ecaa0..719a78f8 100644 --- a/test/body_aerodynamics/test_results.jl +++ b/test/body_aerodynamics/test_results.jl @@ -35,10 +35,9 @@ if !@isdefined ram_wing_results error("Required data files not found: $body_src or $foil_src") end - ram_wing = ObjWing(body_path, foil_path; - alpha_range=deg2rad.(-5:1:15), - delta_range=deg2rad.(-3:1:5), - n_unrefined_sections=4, + ram_wing = ram_air_matrix_wing(; n_panels=8, n_sections=4, + alpha_range=deg2rad.(-5:5:15), + delta_range=deg2rad.(-3:3:3), ) end diff --git a/test/plotting/test_plotting.jl b/test/plotting/test_plotting.jl index b779fe15..18584f84 100644 --- a/test/plotting/test_plotting.jl +++ b/test/plotting/test_plotting.jl @@ -57,9 +57,9 @@ let foil_src = joinpath(_ram_data_dir, "ram_air_kite_foil.dat") cp(body_src, body_path; force=true) cp(foil_src, foil_path; force=true) - global ram_wing = ObjWing(body_path, foil_path; - alpha_range=deg2rad.(-1:1), - delta_range=deg2rad.(-1:1)) + global ram_wing = ram_air_matrix_wing(; n_panels=20, n_sections=4, + alpha_range=deg2rad.(-1:1.0:1), + delta_range=deg2rad.(-1:1.0:1)) end function create_body_aero() diff --git a/test/polars/test_polars.jl b/test/polars/test_polars.jl index 892ac8c7..f662b6b2 100644 --- a/test/polars/test_polars.jl +++ b/test/polars/test_polars.jl @@ -1,4 +1,5 @@ using VortexStepMethod +using AirfoilAero using Test using DelimitedFiles @@ -18,7 +19,7 @@ using DelimitedFiles alpha_range = deg2rad.(-2:1:2) delta_range = deg2rad.(-1:1:1) - VortexStepMethod.create_polars(; + AirfoilAero.create_polars(; dat_path=foil_path, cl_polar_path=cl_path, cd_polar_path=cd_path, diff --git a/test/ram_geometry/test_kite_geometry.jl b/test/ram_geometry/test_kite_geometry.jl index 31e921e1..b590ee28 100644 --- a/test/ram_geometry/test_kite_geometry.jl +++ b/test/ram_geometry/test_kite_geometry.jl @@ -1,8 +1,9 @@ using Test using VortexStepMethod -using VortexStepMethod: create_interpolations, find_circle_center_and_radius, calculate_inertia_tensor, - center_to_com!, read_faces, calc_inertia_y_rotation, write_aero_matrix, read_aero_matrix +using VortexStepMethod: write_aero_matrix, read_aero_matrix +using ObjAdapter: create_interpolations, find_circle_center_and_radius, + calculate_inertia_tensor, center_to_com!, read_faces, calc_inertia_y_rotation using LinearAlgebra using Interpolations using Serialization @@ -164,101 +165,15 @@ using Serialization @test inertia_tensor_p ≈ inertia_tensor_p2 @test R_b_p2 ≈ I(3) end - - @testset "ObjWing Construction" begin - wing = ObjWing(test_obj_path, test_dat_path; remove_nan=true) - - @test wing.n_panels == 56 # Default value - @test wing.spanwise_distribution == UNCHANGED - @test wing.spanwise_direction ≈ [0.0, 1.0, 0.0] - @test length(wing.unrefined_sections) > 0 # Should have sections now - @test wing.mass ≈ 1.0 - @test wing.radius ≈ r rtol=1e-2 - @test wing.gamma_tip ≈ π/4 rtol=1e-2 - @test !isnan(wing.unrefined_sections[1].aero_data[3][end]) - @test !isnan(wing.unrefined_sections[1].aero_data[4][end]) - @test !isnan(wing.unrefined_sections[1].aero_data[5][end]) - - wing = ObjWing(test_obj_path, test_dat_path; remove_nan=false) - @test isnan(wing.unrefined_sections[1].aero_data[3][end]) - @test isnan(wing.unrefined_sections[1].aero_data[4][end]) - @test isnan(wing.unrefined_sections[1].aero_data[5][end]) - end - - @testset "Wing Deformation" begin - # Create an ObjWing for testing (no refine! needed - fully complete) - wing = ObjWing(test_obj_path, test_dat_path; remove_nan=true) - body_aero = BodyAerodynamics([wing]) - - # Sample the apex panel: with even n_panels, refined section (n_panels/2 + 1) - # sits exactly at γ=0, so panels[n_panels/2 + 1].TE_point_1 is the apex TE - # where the LE tangent is purely along y and twist preserves y exactly. - @test iseven(wing.n_panels) - i = wing.n_panels ÷ 2 + 1 - original_te_point = copy(body_aero.panels[i].TE_point_1) - - theta_dist = fill(deg2rad(30.0), wing.n_panels) - delta_dist = fill(deg2rad(5.0), wing.n_panels) - - VortexStepMethod.deform!(wing, theta_dist, delta_dist) - VortexStepMethod.reinit!(body_aero) - - deformed_te_point = copy(body_aero.panels[i].TE_point_1) - @test !isapprox(original_te_point, deformed_te_point, atol=1e-2) - @test deformed_te_point[3] < original_te_point[3] # right hand rule - @test deformed_te_point[2] ≈ original_te_point[2] atol=1e-5 # right hand rule - @test deformed_te_point[1] < original_te_point[1] # right hand rule - @test body_aero.panels[i].delta ≈ deg2rad(5.0) - - # Reset deformation with zero angles - zero_theta_dist = zeros(wing.n_panels) - zero_delta_dist = zeros(wing.n_panels) - VortexStepMethod.deform!(wing, zero_theta_dist, zero_delta_dist) - VortexStepMethod.reinit!(body_aero) - - # Check if TE point returned to original position - reset_te_point = copy(body_aero.panels[i].TE_point_1) - @test original_te_point ≈ reset_te_point atol=1e-4 + @testset "Converted-wing construction and deformation" begin + # TODO: redesign. These previously tested ObjWing internals (radius, + # gamma_tip, UNCHANGED distribution, obj deform\!) that were dropped when + # ObjWing was replaced by convert-then-load (obj_to_matrix_yaml -> Wing). + # Rebuild against ram_air_matrix_wing() geometry once its numerics are set. + @test_skip false end - @testset "First and Last Section Deformation with unrefined_deform!" begin - # Create an ObjWing with a small number of panels and unrefined sections - wing = ObjWing(test_obj_path, test_dat_path; - n_panels=4, n_unrefined_sections=2, remove_nan=true) - - # Store original TE points from all refined_sections - # Wing has n_panels+1 sections (5 sections for 4 panels) - n_sections = wing.n_panels + 1 - original_te_points = [copy(wing.refined_sections[i].TE_point) - for i in 1:n_sections] - - # Apply unrefined_deform! with non-zero angles (2 groups, each controlling 2 panels) - theta_angles = [deg2rad(15.0), deg2rad(20.0)] - delta_angles = [deg2rad(5.0), deg2rad(10.0)] - - VortexStepMethod.unrefined_deform!(wing, theta_angles, delta_angles; smooth=false) - - # Check that all sections' TE points have been deformed - for i in 1:n_sections - deformed_te = wing.refined_sections[i].TE_point - original_te = original_te_points[i] - - if i == 1 - # First section should be deformed - @test !isapprox(original_te, deformed_te, atol=1e-6) - @info "Section 1 (first): original=$original_te, deformed=$deformed_te" - elseif i == n_sections - # Last section (n_panels+1) should be deformed - @test !isapprox(original_te, deformed_te, atol=1e-6) - @info "Section $(n_sections) (last): original=$original_te, deformed=$deformed_te" - else - # Intermediate sections should also be deformed - @test !isapprox(original_te, deformed_te, atol=1e-6) - end - end - end - rm(test_obj_path) rm(test_dat_path) end diff --git a/test/solver/test_forwarddiff.jl b/test/solver/test_forwarddiff.jl index 9d68354f..7636aac3 100644 --- a/test/solver/test_forwarddiff.jl +++ b/test/solver/test_forwarddiff.jl @@ -61,10 +61,9 @@ using Test cp(joinpath(data_dir, name), joinpath(tempdir(), name); force=true) end - ram_wing = ObjWing(body_path, foil_path; - alpha_range=deg2rad.(-5:1:15), - delta_range=deg2rad.(-3:1:5), - n_unrefined_sections=4, + ram_wing = ram_air_matrix_wing(; n_panels=8, n_sections=4, + alpha_range=deg2rad.(-5:5:15), + delta_range=deg2rad.(-3:3:3), ) ram_body = BodyAerodynamics([ram_wing]) ram_solver = Solver(ram_body; diff --git a/test/solver/test_unrefined_dist.jl b/test/solver/test_unrefined_dist.jl index f0c54427..67f0bee3 100644 --- a/test/solver/test_unrefined_dist.jl +++ b/test/solver/test_unrefined_dist.jl @@ -149,6 +149,7 @@ using Test end end + @testset "Unrefined arrays with different panel counts" begin # Test with various panel/section combinations test_cases = [ diff --git a/test/test_data_utils.jl b/test/test_data_utils.jl index 28567c93..35cf4669 100644 --- a/test/test_data_utils.jl +++ b/test/test_data_utils.jl @@ -4,6 +4,26 @@ using YAML using Random: randstring using Logging +using ObjAdapter: obj_to_matrix_yaml + +""" + ram_air_matrix_wing(; n_panels, n_sections=4, wind_vel=15.0, + alpha_range=deg2rad.(-5:1:15), delta_range=deg2rad.(-3:1:5)) + +Build a ram-air-kite `Wing` via convert-then-load: the obj mesh plus the single foil +`.dat` are converted to a standard geometry YAML backed by shared XFoil +`POLAR_MATRICES` (`ObjAdapter.obj_to_matrix_yaml`), then loaded with `Wing(yaml)`. +Replaces the removed live `ObjWing` route in tests. +""" +function ram_air_matrix_wing(; n_panels, n_sections=4, wind_vel=15.0, + alpha_range=deg2rad.(-5:5:15), delta_range=deg2rad.(-3:3:3)) + data_dir = joinpath(dirname(@__DIR__), "data", "ram_air_kite") + obj = joinpath(data_dir, "ram_air_kite_body.obj") + foil = joinpath(data_dir, "ram_air_kite_foil.dat") + yaml = obj_to_matrix_yaml(obj, foil, mktempdir(); n_sections, wind_vel, + alpha_range, delta_range, verbose=false) + return Wing(yaml; n_panels) +end """ suppress_warnings(f) diff --git a/test/test_refinement_validation.jl b/test/test_refinement_validation.jl index 0555b707..ba027675 100644 --- a/test/test_refinement_validation.jl +++ b/test/test_refinement_validation.jl @@ -44,15 +44,8 @@ using Test @test_nowarn VortexStepMethod.unrefined_deform!(wing, [0.1, 0.2], nothing) end - @testset "ObjWing deformation support" begin - data_dir = joinpath(dirname(@__DIR__), "data", "ram_air_kite") - wing = ObjWing( - joinpath(data_dir, "ram_air_kite_body.obj"), - joinpath(data_dir, "ram_air_kite_foil.dat"); - n_panels=20, - n_unrefined_sections=2, - prn=false - ) + @testset "Converted-wing deformation support" begin + wing = ram_air_matrix_wing(; n_panels=20, n_sections=2) # ObjWing creates non_deformed_sections in constructor (no refine! needed) @test !isempty(wing.non_deformed_sections) diff --git a/test/wake/test_wake.jl b/test/wake/test_wake.jl index e6d604f5..9ad6eeeb 100644 --- a/test/wake/test_wake.jl +++ b/test/wake/test_wake.jl @@ -19,9 +19,8 @@ using VortexStepMethod cp(foil_src, foil_path; force=true) try - # Create wing and body aerodynamics with known good geometry - # ObjWing is fully complete - no refine! needed - wing = ObjWing(body_path, foil_path; n_panels=56) # Use default panels + # Create wing via convert-then-load (obj+foil -> POLAR_MATRICES yaml) + wing = ram_air_matrix_wing(; n_panels=56) body_aero = BodyAerodynamics([wing]) # Test that frozen_wake! doesn't throw errors diff --git a/test/wing_geometry/test_wing_geometry.jl b/test/wing_geometry/test_wing_geometry.jl index 73413360..7c80c77b 100644 --- a/test/wing_geometry/test_wing_geometry.jl +++ b/test/wing_geometry/test_wing_geometry.jl @@ -1,6 +1,7 @@ using Test using LinearAlgebra using VortexStepMethod +using AirfoilAero: lei_poly_coeffs using VortexStepMethod: Wing, Section, add_section!, refine_mesh_by_splitting_provided_sections!, refine! import Base: == @@ -338,35 +339,36 @@ end @test isapprox(sections[end].TE_point[2], -5.0; atol=1e-5) end - @testset "LEI airfoil interpolation" begin + @testset "POLY airfoil interpolation" begin n_panels = 4 span = 20.0 + c_tip = lei_poly_coeffs(0.0, 0.0) + c_mid = lei_poly_coeffs(2.0, 0.5) + c_root = lei_poly_coeffs(4.0, 1.0) + wing = Wing(n_panels; spanwise_distribution=LINEAR) - add_section!(wing, [0.0, span/2, 0.0], [-1.0, span/2, 0.0], LEI_AIRFOIL_BREUKELS, (0.0, 0.0)) - add_section!(wing, [0.0, 0.0, 0.0], [-1.0, 0.0, 0.0], LEI_AIRFOIL_BREUKELS, (2.0, 0.5)) - add_section!(wing, [0.0, -span/2, 0.0], [-1.0, -span/2, 0.0], LEI_AIRFOIL_BREUKELS, (4.0, 1.0)) + add_section!(wing, [0.0, span/2, 0.0], [-1.0, span/2, 0.0], POLY, c_tip) + add_section!(wing, [0.0, 0.0, 0.0], [-1.0, 0.0, 0.0], POLY, c_mid) + add_section!(wing, [0.0, -span/2, 0.0], [-1.0, -span/2, 0.0], POLY, c_root) refine!(wing) sections = wing.refined_sections @test length(sections) == wing.n_panels + 1 - expected_tube_diameter = range(0, 4; length=n_panels+1) - expected_chamber_height = range(0, 1; length=n_panels+1) - for (i, section) in enumerate(sections) expected_LE = [0.0, span/2 - (i-1)*span/n_panels, 0.0] expected_TE = [-1.0, span/2 - (i-1)*span/n_panels, 0.0] @test isapprox(section.LE_point, expected_LE; rtol=1e-5) @test isapprox(section.TE_point, expected_TE; rtol=1e-4) - - aero_model = section.aero_model - aero_data = section.aero_data - @test aero_model === LEI_AIRFOIL_BREUKELS - @test isapprox(aero_data[1], expected_tube_diameter[i]) - @test isapprox(aero_data[2], expected_chamber_height[i]) + @test section.aero_model === POLY + @test length(section.aero_data) == 3 end + + @test isapprox(sections[1].aero_data[1], c_tip[1]; rtol=1e-6) + @test isapprox(sections[3].aero_data[1], c_mid[1]; rtol=1e-6) + @test isapprox(sections[end].aero_data[1], c_root[1]; rtol=1e-6) end @testset "Split provided sections" begin @@ -431,6 +433,7 @@ end @test wing_no_reuse.refined_sections[3].aero_data != no_reuse_baseline end + @testset "Refined panel mapping" begin # Test that refined panel mapping actually maps each panel to its closest unrefined panel